Ruby语言误区总结-入门级教程(一)

持续更新ing…

1、字符串不能跟数字相加:

/* PHP */

$i = 1;echo "Value is " + $i

?

上面是PHP中,字符串和数字相加,这完全没有问题,但是如果再Ruby下呢:

i=1puts "Value is " + i#TypeError: can't convert Fixnum into String#from (irb):2:in `+'#from (irb):2

?

可以看到,发生了错误。这也说明,Ruby跟其他动态语言还是有区别的,从PHP转到Ruby阵营的要小心啦。

但这些还是有简单的解决办法:

用to_s就可以转换成同类型

var1 = 2var2 = '5'puts var1.to_s + var2 # 25puts var1 + var2.to_i # 7puts 9.to_f / 2 # 4.5

?

?

2、“凡物皆对象”:

这一点可能对于接触过Ruby的人都知道,但是没有几个人能够真正参悟,例如:

PHPstrlen("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"endcall_block { puts "Blocks are cool!" }# 輸出# "Start"# "Blocks are cool!"# "Blocks are cool!"# "End"

帶有參數的Code block

def call_block    yield(1)    yield(2)    yield(3)endcall_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)endcall_block { |i| puts "#{i}: Blocks are cool!" }# 或是先宣告出 proc objectproc_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作为自己的返回值输出。

青春气贯长虹,勇敢盖过怯懦,进取压倒苟安。

Ruby语言误区总结-入门级教程(一)

相关文章:

你感兴趣的文章:

标签云: