<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

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

    Posted on 2008-10-01 13:37 dennis 閱讀(768) 評論(0)  編輯  收藏 所屬分類: 動態語言

    一、新的語法和語義
    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 12; end
    m{
    |v| v}                                          # => [1, 2]
                                                      # !> multiple values for a block parameter (2 for 1)
    1.9:
    def m; yield 12; 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

    主站蜘蛛池模板: 亚洲国产成人精品无码区二本| 日韩成人在线免费视频| 四虎永久成人免费| 精品国产日韩久久亚洲| 美女网站在线观看视频免费的| 免费看片在线观看| 亚洲精品无码成人AAA片| 亚洲丰满熟女一区二区哦| 女性无套免费网站在线看| 亚洲美女激情视频| 国产精品视频免费观看| 久久精品国产亚洲av水果派| 国产JIZZ中国JIZZ免费看| 午夜国产羞羞视频免费网站| 亚洲中文字幕无码中文| 成人午夜免费福利| 麻豆一区二区三区蜜桃免费| 精品久久久久久久免费加勒比| 456亚洲人成在线播放网站| 4399好看日本在线电影免费| 亚洲熟妇无码AV不卡在线播放| 国产亚洲精品欧洲在线观看| 午夜毛片不卡免费观看视频| 在线a亚洲老鸭窝天堂av高清| 在线播放免费播放av片| 国产性生大片免费观看性| 一二三四视频在线观看中文版免费 | 国产又长又粗又爽免费视频| 国产精品综合专区中文字幕免费播放| 久久久久国产亚洲AV麻豆| 精品国产污污免费网站入口| 亚洲精品熟女国产| 成人网站免费观看| 美女裸免费观看网站| 亚洲成色999久久网站| 一二三四在线播放免费观看中文版视频| 国产亚洲精彩视频| 久久精品国产亚洲一区二区| 精品国产sm捆绑最大网免费站| 亚洲日韩AV一区二区三区四区 | 青草久久精品亚洲综合专区|