Ruby 1 9概要(1)新的語法和語義

2021-09-23 16:41:51 字數 4240 閱讀 2749

一、新的語法和語義

1、新的hash定義語法:

例如  等價於

但是 出錯,並不等價於

2、試驗性質的block內的區域性變數

在1.8,block的與外部同名的變數是同乙個變數,也就是說block內的變數也可以修改外部的同名變數,這很容易形成難以查詢的bug。

例子: #

d =2a 

=lambda

a.call()

d        

#=> 2

注意到,分號後的d是block區域性變數。

3、block的引數現在都是區域性變數

4、新lambda語法,試驗性質:

->

a,b .call(1,

2)   

=>3

一些比較詭異的寫法:

->

.call 

#=> nil

->

a, b  .call(1,

2) #=> 3c =

1; ->

a, b; c  .call(1,

2); c 

#=> 1(注意這裡,;號的c是block的區域性變數,因此c=1在lambda呼叫前後

沒有改變。)

5、 .()的呼叫方式 過去

lambda

.call(1,

2,3)

現在可以簡化為

lambda.(1

,2,3

) .()這樣的方式都將呼叫接受者的call方法,無論接收者是什麼,例如: "

foo".(1

,2)   

#~>  undefined method `call' for "foo":string (nomethoderror)

顯然,這個方式另一種形式上的method_missing,比如在類中應用:

class

test

defself.call(*d)

dend

endtest.(1,

2,3)  

=>[1

,2,3

] 這個特性也是試驗性質

6、block可以使用&block做引數咯。

例子:class

test

define_method :foo 

lambda

endt

=test.new

t.foo do |b

|puts b    

=>

hello

end

7、新的block引數語義,|v| 現在等價於 |v,|

還是通過例子吧:

1.8:

defm; yield1, 

2; end

m                                          

#=> [1, 2]

#!> multiple values for a block parameter (2 for 1)

1.9:

defm; yield1, 

2; end

m                                          

#=> 1

8、允許陣列多重展開

deffoo(*a)

aend

foo(1, 

*[2,

3], 4, 

*[5,

6])                        

#=> [1, 2, 3, 4, 5, 6]a =

[1,2

,3]b 

=[4,

5,6]

[*a, *

b]                                         

#=> [1, 2, 3, 4, 5, 6]

9、可選引數後允許再有強制引數的存在,這在過去是不允許的。例如下面的**在1.8是錯誤的,而1.9卻可以正常執行:

deffoo(a,b="

test

",c)

puts c

endfoo(

1)   

=>

wrong number of arguments(

1for2)

foo(1,

2) =>

2foo(1,

3) =>

3foo(1,

2,3)  

=>

3 更複雜的:

defm(a, b

=nil, 

*c, d)

[a,b,c,d]

endm(

1)  

=>

errorm(1

,2)  =>[1

,nil,,2]

m(1,2

,3) =>[1

,2,,3

]m(1,

2,3,

4)  

=>[1

,2,[3

],4]m(

1,2,

3,4,

5)   

=>[1

,2,[3

,4],5

]m(1,

2,3,

4,5,

6]  

=>[1

,2,[3

,4,5

],6]

10、?c的語義,過去?+字元返回字元的ascii碼整數,現在返回字元"c"

例如:?a  

=>97(

1.8)

?a  

=>"a

"(1.9)

11、方法的引數現在可以將陣列和hash聯合使用,例如下面的例子:

class

test

def(*a)

puts a.inspect

endenda=

[1,2

,3]test.new[

*a,:a

=>

2]   

=>

syntaxerror:compire error (

1.8)

test.new[

*a,:a

=>2] 

=>[1

,2,3

,] (

1.9)

12、列印字元,列印字元和負數,

1.8:printf "%c

","a

"=>

can'

t convert string into integer

printf "%u

",-1

=>

..4294967295

1.9:

printf "%c

","a

"=>

aprintf "%u

",-1

=>-1

13、defined?方法和local variable:

ruby_version                                      

#=> "1.8.5"

ruby_release_date                                 

#=> "2006-08-25"a =

0defined? a                                        

#=> "local-variable"

1.times do |i

|defined? i                                      

#=> "local-variable(in-block)"

end

vs.ruby_version                                      

#=> "1.9.0"

ruby_release_date                                 

#=> "2007-08-03"a =

0defined? a                                        

#=> "local-variable"

1.times do |i

|defined? i                                      

#=> "local-variable"

end

文章**莊周夢蝶  ,原文發布時間 2008-10-01

Ruby 1 9概要(3)類和模組

三 類和模組 1 module instance methods,private instance methods,public instance methods module這三個方法都將返回方法名 的symbol組成的陣列,而非過去的字串陣列。2 module const defined?con...

Ruby1 9亂碼的問題解決

ruby1.9在windows上真是讓人欲哭無淚,總是莫名其妙提示許多編碼上的問題。在跑rails的時候,會提示檔案編碼的問題,往往這時候在檔案頭加上encoding魔法可以解決,即新增移行注釋 encoding utf 8 or tried putting a magic encoding com...

當前IDE工具對Ruby 1 9的支援簡況

作為1.9系列的第乙個穩定版本,ruby 1.9.1已經正式發布了,它毫無疑問會被大量的ruby程式設計師所接受。ruby 1.9引入了許多語義上的改變,甚至增加了新的語法,這些都是ide需要認真對待的事情。我們發起了乙個調查,希望得知主流的ruby ide中哪些可以相容1.9版本,以及他們有著怎樣...