<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)  編輯  收藏 所屬分類: 動態(tài)語言

    一、新的語法和語義
    1、新的Hash定義語法:
    例如{a:2}  等價(jià)于 {:a=>2}
    但是 {"a":2} 出錯,并不等價(jià)于 {:"a"=>2}

    2、試驗(yàn)性質(zhì)的block內(nèi)的局部變量
    在1.8,block的與外部同名的變量是同一個(gè)變量,也就是說block內(nèi)的變量也可以修改外部的同名變量,這很容易形成難以查找的bug。
    例子:
    # {常規(guī)參數(shù);局部變量}
    = 2
    = lambda{|;d| d = 1}
    a.call()
    d        
    # => 2

    注意到,分號后的d是block局部變量。

    3、block的參數(shù)現(xiàn)在都是局部變量

    4、新lambda語法,試驗(yàn)性質(zhì):
    ->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調(diào)用前后沒有改變。)

    5、 .()的調(diào)用方式
    過去
    lambda{|*d| d}.call(1,2,3)

    現(xiàn)在可以簡化為
    lambda{|*d| d}.(1,2,3)

    .()這樣的方式都將調(diào)用接受者的call方法,無論接收者是什么,例如:
     "foo".(1,2)   # ~>  undefined method `call' for "foo":String (NoMethodError)

    顯然,這個(gè)方式另一種形式上的method_missing,比如在類中應(yīng)用:

    class Test
      
    def self.call(*d)
         d
       end
    end
    Test.(
    1,2,3)  => [1,2,3]
    這個(gè)特性也是試驗(yàn)性質(zhì)

    6、block可以使用&block做參數(shù)咯。
    例子:
    class Test
       define_method :foo 
    lambda{|&b| b.call("hello")}
    end
    t
    =Test.new
    t.foo do 
    |b|
       puts b    
    => hello
    end

    7、新的block參數(shù)語義,|v| 現(xiàn)在等價(jià)于 |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、允許數(shù)組多重展開
    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、可選參數(shù)后允許再有強(qiáng)制參數(shù)的存在,這在過去是不允許的。例如下面的代碼在1.8是錯誤的,而1.9卻可以正常運(yùn)行:
    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
    更復(fù)雜的:
    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碼整數(shù),現(xiàn)在返回字符"c"
    例如:
    ?a  => 97  (1.8)
    ?a  
    => "a" (1.9)

    11、[]方法的參數(shù)現(xiàn)在可以將數(shù)組和hash聯(lián)合使用,例如下面的例子:
    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、打印字符,打印字符和負(fù)數(shù),
    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

    主站蜘蛛池模板: 99热在线日韩精品免费| 久久免费国产视频| 久久精品国产亚洲综合色| 足恋玩丝袜脚视频免费网站| 亚洲日本成本人观看| 亚洲日本韩国在线| 国产日韩一区二区三免费高清| 亚洲精品亚洲人成在线播放| 亚洲国产成人五月综合网 | WWW国产亚洲精品久久麻豆| 亚洲国产成人久久综合碰| 精品免费久久久久久久| www成人免费观看网站| 亚洲jjzzjjzz在线播放| 亚洲中文字幕伊人久久无码| 日韩欧毛片免费视频| 国产一级黄片儿免费看| 亚洲欧美第一成人网站7777| 亚洲Av熟妇高潮30p| 亚洲国产精品尤物yw在线| 亚色九九九全国免费视频| 中文字幕在线免费看线人| 亚洲国产成人久久精品软件| 久久亚洲AV成人无码国产| 不卡一卡二卡三亚洲| 日本牲交大片免费观看| **aaaaa毛片免费| 麻豆精品成人免费国产片| 老外毛片免费视频播放| 亚洲三级在线观看| 中文字幕亚洲精品| 久久99国产亚洲高清观看首页| 免费A级毛片无码A| 最近免费中文字幕大全视频| 91青青青国产在观免费影视| 国产又黄又爽胸又大免费视频| 国产天堂亚洲精品| 国产精品亚洲专区无码WEB| 亚洲依依成人亚洲社区| 亚洲一级毛片免费观看| 亚洲国产精品不卡在线电影|