一、新的語法和語義
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版本,以及他們有著怎樣...