`

Ruby 1.9概要(1)新的语法和语义

阅读更多


一、新的语法和语义
1、新的Hash定义语法:
例如{a:2}  等价于 {:a=>2}
但是 {"a":2} 出错,并不等价于 {:"a"=>2}

2、试验性质的block内的局部变量
在1.8,block的与外部同名的变量是同一个变量,也就是说block内的变量也可以修改外部的同名变量,这很容易形成难以查找的bug。
例子:

<!---->#  {常规参数;局部变量}
=   2
=   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
=   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]

=  [ 1 , 2 , 3 ]
=  [ 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"
=  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"
=  0
defined? a                                        
#  => "local-variable"
1 .times do  | i |
  defined? i                                      
#  => "local-variable"
end

 

分享到:
评论

相关推荐

    Programming Ruby 1.9 (3rd edition)和源码

    1. **Ruby 1.9的关键改进**: - 字符串编码:Ruby 1.9引入了对多种字符编码的支持,使得处理多语言文本变得更加灵活。 - 更强的错误检测:在1.9版本中,语法错误和类型检查更加严格,减少了运行时错误。 - 全新的...

    windows下安装Ruby 1.9 二进制zip包

    总结起来,安装Ruby 1.9的二进制zip包主要涉及下载、解压、配置环境变量和处理依赖。这些步骤对于不熟悉编译环境的用户来说,比从源码编译要简单得多。然而,务必注意保持Ruby及其依赖库的更新,以确保系统的安全性...

    Programming Ruby 1.9

    5. **数组和哈希初始化**:在Ruby 1.9中,数组和哈希的初始化有了新的语法,如`[1, 2, 3]`和`{a: 1, b: 2}`。哈希的键值对可以用紧凑的语法表示,不再需要`:key =&gt; value`的形式。 6. **模块混合**:Ruby 1.9改进了...

    透视Ruby 1.9的Lambda函数

    Ruby 1.9引入了一种新的、更简洁的Lambda语法:`-&gt;`。这种语法糖极大地提高了代码的可读性,使得Lambda函数的定义更加直观。例如,以下代码展示了如何使用新语法创建Lambda: ```ruby x = -&gt;{puts "Hello Lambda"} ...

    为何Ruby 1.9的不兼容性会导致原有Ruby代码无法工作

    1. **语法调整**:如在`if`、`unless`和`case`语句中,不再允许使用冒号`: `替代`then`关键字。 2. **数据类型转换**:`instance_variables`和`constants`等反射方法返回的不再是字符串数组,而是符号数组。 3. **...

    ruby 1.9 教程

    Ruby 1.9在性能、语法改进以及新特性方面进行了大量的更新和优化。 - **Ruby 2.0 版本**: Ruby 2.0版本预计将于2010年发布,这表明Ruby 1.9是当时最新的稳定版本。 #### 详细知识点解析 ##### 1. Ruby 基础介绍 - *...

    Programming Ruby 1.9 The Pragmatic Programmers' Guide

    Ruby 1.9是Ruby的一个重要版本,引入了许多改进和新特性,包括性能优化、新的字符串编码系统、改进的模块和类的加载机制等。 在本书中,读者将学习到以下核心知识点: 1. **基础语法**:了解Ruby的基本数据类型,...

    Programming Ruby 1.9 & 2.0 The Pragmatic Programmers’ Guide 4th Edition

    Ruby是一种快速发展的激动人心的动态语言,本书是Ruby 1.9和Ruby 2.0这两个最新版本的完整参考指南。Ruby是一种完全面向对象的语言,类似于经典的面向对象语言Smalltalk。与Smalltalk一样,它是动态类型的,但与...

    Programming Ruby 1.9 3rd edition

    - **第2章**:“Ruby的新特性”,进一步探讨了Ruby作为一门面向对象的语言的特点,并介绍了基本的Ruby语法、数组和哈希表、符号、控制结构、正则表达式、块和迭代器等核心概念。 #### 三、关键知识点详解 ##### 1....

    (ruby 1.9 开发)Rango

    - **仅支持 Ruby 1.9**:Rango 专门为 Ruby 1.9 设计,利用了 Ruby 1.9 中的新特性和性能提升。 - **代码生成器**:提供了生成器来帮助快速搭建项目结构,但并不强制要求特定的项目结构。 - **代码热加载**:通过...

    Programming Ruby 1.9 (Pragmatic Bookshelf 2009).pdf

    《Programming Ruby 1.9》一书由Dave Thomas、Chad Fowler与Andy Hunt共同编写,是Pragmatic Bookshelf出版的一部权威性指南,旨在帮助读者深入理解和掌握Ruby编程语言的1.9版本。该书不仅是对原版《Programming ...

    Ruby编程语言_涵盖Ruby 1.8和1.9

    此外,Ruby 1.9还引入了新的内建数据结构,如Symbol表和Fixnum/Bignum的合并,提高了性能。 Ruby编程语言的核心特性包括: 1. 面向对象:Ruby是一种纯粹的面向对象语言,所有数据都是对象,包括基本类型,如整数和...

    [Ruby] Ruby 1.9 & 2.0 编程 (英文版)

    [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 , ...

    Pragmatic.Programming.Ruby.1.9.Apr.2009.pdf

    Ruby 1.9是Ruby语言的一个重大更新,它引入了多项改进和新特性,包括但不限于性能优化、新的字符串处理方式、改进的数组和哈希表操作、以及更强大的元编程能力。这些变化使得Ruby 1.9在处理大数据量和复杂逻辑时更加...

    Pragmatic.Programming.Ruby.1.9

    通过这些内容的学习,读者将能够掌握Ruby 1.9的基本语法和核心编程技巧,为后续深入学习打下坚实的基础。此外,本书还提供了丰富的实践案例和深入的技术讨论,适合所有级别的Ruby开发者阅读和参考。

Global site tag (gtag.js) - Google Analytics