<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

    主站蜘蛛池模板: 成人免费视频88| 3344永久在线观看视频免费首页| 亚洲国产一区在线观看| 午夜爽爽爽男女免费观看影院| 永久黄网站色视频免费| 亚洲精品久久无码| 成在线人永久免费视频播放| 色五月五月丁香亚洲综合网| 亚洲av日韩片在线观看| 成人免费观看男女羞羞视频| 亚洲热妇无码AV在线播放| 免费看无码特级毛片| 国产精品色午夜视频免费看| 婷婷亚洲综合五月天小说在线| 免费播放春色aⅴ视频| 亚洲精品国产专区91在线| 亚洲日本在线免费观看| 亚洲二区在线视频| 在线播放免费播放av片| 免费国产高清毛不卡片基地| 在线观看午夜亚洲一区| 18禁美女裸体免费网站| 亚洲精品久久无码| 亚洲中文字幕日产乱码高清app| 91精品国产免费入口| 亚洲一区精彩视频| 亚洲国产精品成人久久蜜臀| 免费黄色电影在线观看| 亚洲精品综合在线影院| 亚洲精品国产自在久久| 亚洲一区二区三区免费观看| 亚洲a∨无码一区二区| 国产亚洲无线码一区二区| 免费不卡视频一卡二卡| 手机永久免费的AV在线电影网| 亚洲毛片在线观看| 国产精品免费小视频| 久久免费区一区二区三波多野| 亚洲天然素人无码专区| 亚洲一区二区三区AV无码| aa级一级天堂片免费观看|