一、新的语法和语义
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
分享到:
相关推荐
1. **Ruby 1.9的关键改进**: - 字符串编码:Ruby 1.9引入了对多种字符编码的支持,使得处理多语言文本变得更加灵活。 - 更强的错误检测:在1.9版本中,语法错误和类型检查更加严格,减少了运行时错误。 - 全新的...
总结起来,安装Ruby 1.9的二进制zip包主要涉及下载、解压、配置环境变量和处理依赖。这些步骤对于不熟悉编译环境的用户来说,比从源码编译要简单得多。然而,务必注意保持Ruby及其依赖库的更新,以确保系统的安全性...
5. **数组和哈希初始化**:在Ruby 1.9中,数组和哈希的初始化有了新的语法,如`[1, 2, 3]`和`{a: 1, b: 2}`。哈希的键值对可以用紧凑的语法表示,不再需要`:key => value`的形式。 6. **模块混合**:Ruby 1.9改进了...
Ruby 1.9引入了一种新的、更简洁的Lambda语法:`->`。这种语法糖极大地提高了代码的可读性,使得Lambda函数的定义更加直观。例如,以下代码展示了如何使用新语法创建Lambda: ```ruby x = ->{puts "Hello Lambda"} ...
1. **语法调整**:如在`if`、`unless`和`case`语句中,不再允许使用冒号`: `替代`then`关键字。 2. **数据类型转换**:`instance_variables`和`constants`等反射方法返回的不再是字符串数组,而是符号数组。 3. **...
Ruby 1.9在性能、语法改进以及新特性方面进行了大量的更新和优化。 - **Ruby 2.0 版本**: Ruby 2.0版本预计将于2010年发布,这表明Ruby 1.9是当时最新的稳定版本。 #### 详细知识点解析 ##### 1. Ruby 基础介绍 - *...
Ruby 1.9是Ruby的一个重要版本,引入了许多改进和新特性,包括性能优化、新的字符串编码系统、改进的模块和类的加载机制等。 在本书中,读者将学习到以下核心知识点: 1. **基础语法**:了解Ruby的基本数据类型,...
Ruby是一种快速发展的激动人心的动态语言,本书是Ruby 1.9和Ruby 2.0这两个最新版本的完整参考指南。Ruby是一种完全面向对象的语言,类似于经典的面向对象语言Smalltalk。与Smalltalk一样,它是动态类型的,但与...
- **第2章**:“Ruby的新特性”,进一步探讨了Ruby作为一门面向对象的语言的特点,并介绍了基本的Ruby语法、数组和哈希表、符号、控制结构、正则表达式、块和迭代器等核心概念。 #### 三、关键知识点详解 ##### 1....
- **仅支持 Ruby 1.9**:Rango 专门为 Ruby 1.9 设计,利用了 Ruby 1.9 中的新特性和性能提升。 - **代码生成器**:提供了生成器来帮助快速搭建项目结构,但并不强制要求特定的项目结构。 - **代码热加载**:通过...
《Programming Ruby 1.9》一书由Dave Thomas、Chad Fowler与Andy Hunt共同编写,是Pragmatic Bookshelf出版的一部权威性指南,旨在帮助读者深入理解和掌握Ruby编程语言的1.9版本。该书不仅是对原版《Programming ...
此外,Ruby 1.9还引入了新的内建数据结构,如Symbol表和Fixnum/Bignum的合并,提高了性能。 Ruby编程语言的核心特性包括: 1. 面向对象:Ruby是一种纯粹的面向对象语言,所有数据都是对象,包括基本类型,如整数和...
[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 1.9是Ruby语言的一个重大更新,它引入了多项改进和新特性,包括但不限于性能优化、新的字符串处理方式、改进的数组和哈希表操作、以及更强大的元编程能力。这些变化使得Ruby 1.9在处理大数据量和复杂逻辑时更加...
通过这些内容的学习,读者将能够掌握Ruby 1.9的基本语法和核心编程技巧,为后续深入学习打下坚实的基础。此外,本书还提供了丰富的实践案例和深入的技术讨论,适合所有级别的Ruby开发者阅读和参考。