一、新的语法和语义
1、新的Hash定义语法:
例如{a:2} 等价于 {:a=>2}
但是 {"a":2} 出错,并不等价于 {:"a"=>2}
2、试验性质的block内的局部变量
在1.8,block的与外部同名的变量是同一个变量,也就是说block内的变量也可以修改外部的同名变量,这很容易形成难以查找的bug。
例子:
<!---->#
{常规参数;局部变量}
d
=
2
a
=
lambda
{
|
;d
|
d
=
1
}
a.call()
d
#
=> 2
注意到,分号后的d是block局部变量。
3、block的参数现在都是局部变量
4、新lambda语法,试验性质:
<!---->->
a,b {a
+
b}.call(
1
,
2
)
=>
3
一些比较诡异的写法:
<!---->->
{ }.call
#
=> nil
->
a, b { a
+
b }.call(
1
,
2
)
#
=> 3
c
=
1
;
->
a, b; c { c
=
a
+
b }.call(
1
,
2
); c
#
=> 1(注意这里,;号的c是block的局部变量,因此c=1在lambda调用前后
没有改变。)
5、 .()的调用方式
过去
<!---->lambda
{
|*
d
|
d}.call(
1
,
2
,
3
)
现在可以简化为
<!---->lambda
{
|*
d
|
d}.(
1
,
2
,
3
)
.()这样的方式都将调用接受者的call方法,无论接收者是什么,例如:
<!---->
"
foo
"
.(
1
,
2
)
#
~> undefined method `call' for "foo":String (NoMethodError)
显然,这个方式另一种形式上的method_missing,比如在类中应用:
<!---->
class
Test
def
self.call(
*
d)
d
end
end
Test.(
1
,
2
,
3
)
=>
[
1
,
2
,
3
]
这个特性也是试验性质
6、block可以使用&block做参数咯。
例子:
<!---->class
Test
define_method :foo
lambda
{
|&
b
|
b.call(
"
hello
"
)}
end
t
=
Test.new
t.foo do
|
b
|
puts b
=>
hello
end
7、新的block参数语义,|v| 现在等价于 |v,|
还是通过例子吧:
1.8:
<!---->def
m;
yield
1
,
2
; end
m{
|
v
|
v}
#
=> [1, 2]
#
!> multiple values for a block parameter (2 for 1)
1.9:
<!---->def
m;
yield
1
,
2
; end
m{
|
v
|
v}
#
=> 1
8、允许数组多重展开
<!---->def
foo(
*
a)
a
end
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却可以正常运行:
<!---->def
foo(a,b
=
"
test
"
,c)
puts c
end
foo(
1
)
=>
wrong number of arguments(
1
for
2
)
foo(
1
,
2
)
=>
2
foo(
1
,
3
)
=>
3
foo(
1
,
2
,
3
)
=>
3
更复杂的:
<!---->def
m(a, b
=
nil,
*
c, d)
[a,b,c,d]
end
m(
1
)
=>
error
m(
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
end
end
a
=
[
1
,
2
,
3
]
Test.new[
*
a,:a
=>
2
]
=>
SyntaxERROR:compire error (
1.8
)
Test.new[
*
a,:a
=>
2
]
=>
[
1
,
2
,
3
,{:a
=>
2
}] (
1.9
)
12、打印字符,打印字符和负数,
<!---->1.8
:
printf
"
%c
"
,
"
a
"
=>
can
'
t convert String into Integer
printf
"
%u
"
,
-
1
=>
..
4294967295
1.9
:
printf
"
%c
"
,
"
a
"
=>
a
printf
"
%u
"
,
-
1
=>
-
1
13、defined?方法和local variable:
<!---->
RUBY_VERSION
#
=> "1.8.5"
RUBY_RELEASE_DATE
#
=> "2006-08-25"
a
=
0
defined? 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
=
0
defined? a
#
=> "local-variable"
1
.times do
|
i
|
defined? i
#
=> "local-variable"
end
分享到:
相关推荐
Programming Ruby 1.9 (3rd edition)和源码
Programming Ruby 2.0 1.9 pdf
NULL 博文链接:https://hlee.iteye.com/blog/599644
Programming Ruby 1.9 The Pragmatic Programmers' Guide -- Ruby 编程的圣经教程。此版本涵盖最新的Ruby 1.9
Programming Ruby 1.9 3rd edition.Cover ruby 1.9.2, downloaded from pragmatic bool shelf, please enjoy.
Programming Ruby 1.9
This book is the only complete reference for both Ruby 1.9 and Ruby 2.0, the very latest version of Ruby. 2013 marks the 20th anniversary of the Ruby language. We’re proud that throughout its history...
ruby 1.9上的轻量级网络开发框架,提供generator!
[Pragmatic Bookshelf] Ruby 1.9 & 2.0 编程 (英文版) [Pragmatic Bookshelf] Programming Ruby 1.9 & 2.0 The Pragmatic Programmers' Guide 4th Edition (E-Book) ☆ 出版信息:☆ [作者信息] Dave Thomas , ...
一些Ruby程序员将Ruby 1.9的发布看做是迈入Ruby新版本的标志性事件,但他们却发现在1.8版本和1.9版本语言之间的刻意不兼容性会导致原有Ruby代码无法工作。真正的问题是,Ruby 1.9.0发布的原因以及其与Ruby1.8之间的...
2009年的新书--Programming Ruby 1.9
最新的ruby 教程 2009 年 ruby 已经发展到了1.9 2.0要到2010年了
ruby 1.9是ruby发展历史上的一个里程碑版本: 1、ruby 1.9首次引入字节码即时编译技术,可以大大提高ruby本身的性能。根据之前的综合评测来看,1.9的性能大约是1.8.6的三倍左右,性能追上了Python。 2、ruby 1.9...
Programming Ruby 1.9 3rd Edition – FreePdfBook
Ruby的Block块是它的关键特色之一,用块能够写出简明且高度可重用的算法。即使没有别的用处,它至少消弱了人们对循环敬畏的态度。这个概念在其他语言和理论中还被称为:Lambda函数。Lambda是个十分令人迷惑的词汇,...
Ruby编程语言_涵盖Ruby 1.8和1.9
把它解压到windows\\system32就可以了! 博文链接:https://ennic.iteye.com/blog/151324
CoverMe – Ruby 1.9的代码覆盖率 Ruby 1.9(.2)是一种令人赞叹的语言,可用于开发应用程序。它比Ruby 1.8。×更快,更强大,更干净,并且具有巨大的改进。 由于这些原因,每个Ruby开发人员都应该转向我们的语言的...