持续更新ing...
1、字符串不能跟数字相加:
/* PHP */
$i = 1;
echo "Value is " + $i
上面是PHP中,字符串和数字相加,这完全没有问题,但是如果再Ruby下呢:
i=1
puts "Value is " + i
#TypeError: can't convert Fixnum into String
# from (irb):2:in `+'
# from (irb):2
可以看到,发生了错误。这也说明,Ruby跟其他动态语言还是有区别的,从PHP转到Ruby阵营的要小心啦。
但这些还是有简单的解决办法:
用to_s就可以转换成同类型
var1 = 2
var2 = '5'
puts var1.to_s + var2 # 25
puts var1 + var2.to_i # 7
puts 9.to_f / 2 # 4.5
2、“凡物皆对象”:
这一点可能对于接触过Ruby的人都知道,但是没有几个人能够真正参悟,例如:
PHP的strlen("test")
用法,在Ruby中是"test".length
。
这一点,你注意到了没?
3、Symbol 唯一且不会变动的识别符号
在Hash中,经常会有:XXX这种识别符,比如:
config = { :foo => 123, :bar => 456 }
puts config[:foo] # 輸出 123
使用Symbol的理由是可以獲得執行上的效率,相同名稱的Symbol不會再重複建構物件,範例如下:
"foobar".object_id # 2151854740
"foobar".object_id # 2151830100
:foobar.object_id # 577768
:foobar.object_id # 577768
object_id
方法會回傳Ruby內部的記憶體配置編號,你會發現相同內容的字串,也會是不同的新物件,但是Symbol不會。這種特性讓Symbol的主要用途是當做Hash的鍵。
4. If置于行末??!!
是的,在Ruby语言当中,如果if之后要执行的语句只有一句的话,我们可以将执行语句前置,比如:
puts "greater than ten" if total > 10
5、真假易辨:
只需记住一点,Ruby中,除了false, nil这两个,其他全部都值真的。真的?真的!
6、方法的各种省略:
Ruby中,方法的返回值return可以省略,Ruby默认将方法中的最后一行代码产生的值return。并且,方法后面的括号可以省略。省略无下限啊。。。
7.Yield
在方法中使用yield
可以執行Code block參數:
# 定義方法
def call_block
puts "Start"
yield
yield
puts "End"
end
call_block { puts "Blocks are cool!" }
# 輸出
# "Start"
# "Blocks are cool!"
# "Blocks are cool!"
# "End"
帶有參數的Code block
def call_block
yield(1)
yield(2)
yield(3)
end
call_block { |i|
puts "#{i}: Blocks are cool!"
}
# 輸出
# "1: Blocks are cool!"
# "2: Blocks are cool!"
# "3: Blocks are cool!"
Proc object
可以將Code block明確轉成一個變數:
def call_block(&block)
block.call(1)
block.call(2)
block.call(3)
end
call_block { |i| puts "#{i}: Blocks are cool!" }
# 或是先宣告出 proc object
proc_1 = Proc.new { |i| puts "#{i}: Blocks are cool!" }
proc_2 = lambda { |i| puts "#{i}: Blocks are cool!" }
call_block(&proc_1)
call_block(&proc_2)
# 輸出
# "1: Blocks are cool!"
# "2: Blocks are cool!"
# "3: Blocks are cool!"
8、数组的输出-join方法
print arr.join(", ")."\n" 意思是:将数组 arr转换成字符串输出,用", "隔开每个
元素,并且换行。一个数组可以用join方法转换成字符串,join()内的参数也是一个字符串,用来分隔数组的每个元素,例如:arr.join(",")。
arr=[3,4,5]
print arr #输出:345
print arr.join(", ") #输出:3,4,5
9、Ruby中的yield
可以用大括号{ }将代码组织成块,也可以用 do…end 将代码组织成块。大括号{ }的优先级高于 do…end。代码块,简称块。
yield [ji:ld] 产生,输出……
注意:{}或者do…end之间的是块。
#E8.4-1.rb def one_block yield yield yield end
|
one_block { puts "This is a block." } |
代码块 |
把块作为参数,带入到def定义中的yield处即可。
调用一次块要用关键字yield。每一次yield,块就被调用一次。
yield还可以带参数调用块,yield后面是实参,块定义处是形参。
一个块可以接收yield传来的参数,还可以将结果返回给调用它的方法。
10、闭包
代码块是一段代码,相当于一个匿名方法,被调用它的方法所调用。
如果我们不仅仅想调用代码块,还想把代码块作为参数传递给其它方法,就要使用闭包。
闭包也是一段代码,一个代码块,而且能够共享其它方法的局部变量。
闭包既然是一段代码,也就有自己的状态,属性,作用范围,也就是一个可以通过变量引用的对象,我们称之为过程对象。
一个过程对象用 proc 创建,用 call 方法来调用。
¨ 闭包作为参数传递给其它方法
以下两个程序相同
程序1 | 程序2 |
def method(pr) puts pr.call(7) end
oneProc=proc{|k| k *=3} method(oneProc) | oneProc=proc{|k| k *=3}
puts oneProc.call(7) |
#过程对象oneProc作为一个参数,传递给method; |
|
¨ 闭包共享其它方法局部变量
def method(n) return proc{|i| n +=i } end
oneProc=method(3) puts oneProc.call(9) #12 puts oneProc.call(5) #17 | 方法method返回一个Proc对象,这个对象引用了函数的参数n。即使参数n在闭包被调用时已经不在自己的作用域里,这个闭包还是可以访问参数n,并且和方法method共同拥有变量n。开始时方法method的变量n是3;oneProc.call(9)的时候,oneProc 更新了变量n,把n=12 传回给方法method;oneProc.call(5)的时候,oneProc取出方法 method 的变量 n=12,更新为n=17,传回给方法method的同时,也把n=17作为自己的返回值输出。 |