Ruby基础学习笔记

目录

Ruby的基本概念

Ruby的控制语句

Ruby的循环

Ruby的数组与散列

Ruby的基本概念

运行Ruby的方式

  • irb:可交互命令行,每输入一个式子,它都会用=>给出一个值
  • ruby + 文件路径

变量

  • 没有关键字: 没有var, let, const, 直接 a=1 就行
  • 局部变量: 小写字母开头,或者_开头

  • 全局变量: $开头

  • 类变量: @@开头

  • 实例变量: @开头

Ruby默认没有闭包

  • 代码
a = 1
def f1
 p a
end
fi() #括号可以省略
#报错:a不存在
  • 默认没有闭包

闭包是指函数可以使用外部的自由变量
没有闭包是指函数不可以使用外部的自由变量
用Ruby其他语法可以实现闭包

常量

全大写:RUBY_VERSION/ARGV

  • 代码
A = 1
def f1
 p A
end
f1 #1
  • 大写就是常量

多重赋值(JavaScript里叫做析构赋值)

  • 简化
a,b,c = 1,2,3
a,b,*c = 1,2,3,4,5
a,*b,c = 1,2,3,4,5
  • 交换
a,b = b,a
  • 数组
arr = [1,2]
a,b = arr #a=1,b=2

字符串

  • 单引号

puts '12\n34' #单引号不会转义

  • 双引号

puts "12\n34" #双引号会把\n转义成换行

  • 多行字符串
puts <<eos
 12
 34
 56
eos

log

  • 打印数据

print('a', 'b')-默认不加换行
puts('a', 'b')-默认每个加换行
p('a', 'b')-加换行,不转义,并且会直观的看出数据类型
只要没有歧义,括号()都可以省略

  • 使用场景

程序员一般使用 p
日志里一般使用 puts 和 print

注释

  • 单行注视

#这是单行注释
#这是第二行注释

  • 多行注释

=begin
多行注释
=end

Ruby的控制语句

Ruby的if语句

if a > 3 then p 'big' end

if a > 3 then p 'big' else p 'small' end  #ruby的if语句是有值的

p(if a > 3 then 'big' else p 'small' end) 

p(if a > 4
 'big'
elsif a > 2  #else if 在 ruby 里要写成 elsif
 'middle'
else
 'samll'
end)

Ruby的if语句2

b = if a > 3 then 'big' else 'samll' end
b = a > 3 ? 'big' : 'small'

return if error
return unless success  # unless 和 if 是反逻辑

case语句(相当于JavaScript的switch case)

z = case x
    when 1
     '1'
    when 2,3
     '2 or 3'
    else
     'others'
    end  

Ruby的循环

.times方法
for 关键字
while 关键字
until 关键字
.each方法
loop 关键字

.times方法

  • 一夜7次
7.times do 
  p 'one time'
end  
或者
7.times {p 'one time'}
  • 相当于JavaScript的
    [0,1,2,3,4,5,6].map(i => {p 'one time'})

  • .times是一个函数
  • do...end是代码块
  • {...}也是代码块
  • 一般多行用do...end 单行用{...}
  • 代码块作为.time函数的参数
  • ruby的函数调用可以省略()
  • 获取 i
7.times do |i|
  p "#{i+1} 次"  #这里必须使用双引号,否则不会转义,相当于JS的${i}
end
或者
7.times { |i|
  p "#{i+1} 次"
}
两个代码都可以写成一行:
7.times do |i| p "#{i+1} 次" end
7.times { |i| p "#{i+1} 次"}

.each方法

  • 代码
name = ['hanbaoyi', 'hby']
name.each do |name|
 p name
end

name.each { |name| p name }

(1...7).each do |i| #1...7是一个Range,可以用(1...7).class打印出来
 p i
end

(1...7).each { |i| p i }

for关键字

while/until关键字

loop关键字

  • 代码(千万不能运行)
    loop do
    p 'ruby'
    end

上面的代码会一直无限循环,除非在里面写break

跳出循环

break 表示退出所以循环
next 表示退出当前循环,进入下一次循环
对于JavaScript里的 breakcontinue

Ruby的数组与散列

Ruby中的数据类型

  • 只有对象,可用.class查看类

整数-Integer对象/Numeric对象
浮点数-Float对象
字符串-String对象
数组-Array对象
正则表达式-Regexp对象
文件-File对象
符号-Symbol对象
异常-Exception对象
散列-Hash对象

  • 标识

每个对象都有一个object_id属性,表示其唯一性
如: a.object_id a.equal? b

数组

由Array类构造出来的对象
[1,2].class #Array

  • Ruby数组

mixed = [1,2,'a','b','3']
mixed.size #相当于写mixed.size()
=>5
mixed.methods
打印出mixed的所有方法,注意这些方法都是以:冒号开头的,这是symbol

散列

由Hash类构造出来的对象

  • 创建一个散列
    person = {name: 'hby', age: 18} #这是一个语法糖,ruby2.0之前的版本是不支持这种写法的

  • symbol

上面的nameage不是字符串,而是symbol
等价于person = {:name=>'hby', :age=>18}
person.keys
=>[:name,:age]
如果想要字符串作为key,应该写成
person = {'name'=>'hby','age'=>18}

  • 注意

你可以认为symbol是轻量级的字符串,功能更少
:name.to_s得到字符串,'name'.to_sym得到符号

遍历散列

  • .each方法
person.each do |key,value|
 p "key: #{key}, value: #{value}"
end
#输出时,symbol会自动变成string

与JavaScript的区别

person = {name: 'hby', age: 18},如果你想要获取'hby'

  • 不能用person.name
    必须用person[:name]

  • 不能用person['name']
    必须用person[:name]

  • 'name'和:name是不同的
    person['name'] = 'jack'
    person.keys #[:name,:age,'name']

与JavaScript的区别2

def say_hi
 p 'hi'
end
person = {name: 'hby', age: 18}
如果你想要给person加一个方法/函数
  • 不能用person[:say_hi] = say_hi

因为say_hi等价于say_hi()
say_hi 的返回值为 p 'hi' 的返回值,也就是'hi'
所以相当于 person[:say_hi] = 'hi'

  • 可以用lambda表达式做到

person[:say_hi] = lambda{p 'hi'}
person[:say_hi].call() #括号()可以省略

推荐的一些学习资源

过于简单,适合新手

  • API手册(字典)

devdocs.io 建议学习的时候查
apidock.com/ruby 建议做项目的时候查,更全面

  • 书籍

《Ruby基础教程》很基础,看起来很慢
《Ruby元编程》高级教程,等你熟悉Rails之后再考虑看

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容