解析.NET程序員 Ruby核心語法入門(5)_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:關于URL的傳遞字符串問題的研究
      前幾天在調程序的時候遇到了比較郁悶的問題,我用URL從一個頁面傳遞字符串到另一個頁面的時,出現了個奇怪的問題,我要傳遞的字符串是“DK51 700中繼站”;可是另一個頁面接收到

      Ruby執行的某些東西叫做“鴨式輸入”:如果它走起路來像鴨子或聲音也像鴨子,那它一定就是鴨子。你不用問它“你是一只鴨子嗎?”,你只需要將它當做鴨子對它呷呷地叫就可以了,如果你渴望成為一只鴨子,只要你能呷呷地叫的就可以加入這個party。

      注意greet函數定義時沒有對對象的類型做任何限制,因為它只打印它們—Ruby中任何事物都是支持打印的,這得益于to_s類函數的優點,它可以將任何對象轉換成字符串,最終結果就是你可以greet它們。

      下面是另一個例子:

      irb(main):006:0> def print_len(item)
      irb(main):007:1> puts "Len = #{item.length}"
      irb(main):008:1> end
      => nil
      irb(main):009:0> print_len "Reader"
      Len = 6
      => nil
      irb(main):010:0> print_len [1, 4, 9]
      Len = 3
      => nil
      irb(main):011:0> print_len 42
      NoMethodError: undefined method <span class="pf">'</span>length' for
      42:Fixnum
      from (irb):7:in <span class="pf">'</span>print_len'
      from (irb):11

      這里的print_len函數做的事情更多了:它調用了length函數。因此傳遞給print_len的是length函數的返回值,可以傳遞一個字符串或一個數組,因為它們都有對應的length函數,但是不能傳遞一個數字,因為沒有對應數字的length函數。

      為了在.NET中編寫一個類似的函數,你可能需要創建一個IHaveLength接口作為你的參數類型,由于在你創建接口前類就已經創建好了,所以不幸的是,可能你需要創建一個類型轉換器。

      從另一方面來看,至少你已經有了IHaveLength,并且知道函數需要什么東西,既然類型擔當的是某種格式文檔的角色,在動態語言中你需要一個取舍,這樣你會在編寫文檔和單元測試時更自信,可以幫助你識別類或函數是如何使用的。

      Ruby支持默認的參數值,如:

      irb(main):012:0>def repeat(val, times = 5)
      irb(main):013:1>val.to_s * times
      irb(main):014:1>end
      =>nil
      irb(main):015:0>repeat "hi"
      =>"hihihihihi"
      irb(main):016:0>repeat "hi", 3
      =>"hihihi"
      irb(main):017:0>repeat 10, 3
      =>"101010"

      注意在to_s * times前面沒有return,除非你明確地告訴它返回什么值,否則Ruby中的函數總是返回最后一個賦值,因此就不需要return關鍵字了。

      Ruby支持變量參數,如:

      irb(main):018:0> def add(*values)
      irb(main):019:1> result = 0
      irb(main):020:1> values.each {|x| result = x}
      irb(main):021:1> result
      irb(main):022:1> end
      => nil
      irb(main):023:0> add 1, 2, 3, 4, 5
      => 15

      Ruby將變量參數打包成一個數組,然后你就可以訪問傳遞來的值,并且可以將它們集合到一塊兒。

      函數和變量命名約定

      Ruby中的函數以小寫字母開頭,可以包含字母,數字和下劃線。改變基礎對象的函數名稱以一個驚嘆號(!)結束,例如:upcase函數返回字符串的大寫,但是還單獨保留了原始字符串;相反,upcase!函數就真實地改變了基礎字符串。
      回答問題(返回布爾值)的函數名稱以一個問號(?)結束。

      類是來自新對象實例創建時的模板,例如:為了將前面的greet函數放入一個類,你可能要編寫以下代碼:

      irb(main):001:0> class Manners
      irb(main):002:1> def greet(name)
      irb(main):003:2> puts "Hello, #{name}!"
      irb(main):004:2> end
      irb(main):005:1> end
      => nil
      irb(main):006:0> m = Manners.new
      => # 前面的代碼創建了一個新的類,叫做Manners,并將函數greet添加到該類中了,最后,它創建了一個Manners類的實例,使用它greet Reader。

      你可能認為在Ruby中類是對象的活動模板,與.NET中的類不同,Ruby中的類是編譯時定義的,你可以對其進行任意擴展,當你完成擴展后,類的現有實例也會立即得到新的反應,注意當你嘗試告訴它farewell時會發生什么,如:

      irb(main):008:0> m.farewell "Reader"
      NoMethodError: undefined method 'farewell' for
      #<Manners:0x404839c>
      from (irb):8

      當你嘗試調用farewell時,系統會告訴你它不知道這是什么,那么就可以對Manners類進行擴展,讓它知道這么說拜拜,如:

      irb(main):009:0>class Manners
      irb(main):010:1>def farewell(name)
      irb(main):011:2>puts "Goodbye, #{name}!"
      irb(main):012:2>end
      irb(main):013:1>end
      =>nil
      irb(main):014:0>m.farewell "Reader"
      Goodbye, Reader!
      =>nil

      擴展了Manners類后,它的已有實例就會立即獲得這個新的功能。

      Manners類有兩個函數,兩個都需要你的名字,你可能需要重新編寫它以便你創建它時可以傳遞名字給它,Ruby調用initialize函數,你傳遞的所有參數都傳遞給new,下面是更新后的Manners類:

      irb(main):001:0> class Manners
      irb(main):002:1> def initialize(name)
      irb(main):003:2> @name = name
      irb(main):004:2> end
      irb(main):005:1> def greet
      irb(main):006:2> puts "Hello, #{@name}!"
      irb(main):007:2> end
      irb(main):008:1> def farewell
      irb(main):009:2> puts "Goodbye, #{@name}!"
      irb(main):010:2> end
      irb(main):011:1> end
      => nil
      irb(main):012:0> m = Manners.new "Reader"
      => #

      分享:.NET Framework 3.5 SP1正式版
      微軟今天發布了.NET Framework 3.5第一個SP服務包的最終版.這是一個累積更新,包含很多基于.NET Framework 2.0、3.0和3.5不斷生成的新功能,此外還包括.NET Framework 2.0 SP2和.NET Framewo

      來源:模板無憂//所屬分類:.Net教程/更新時間:2009-08-02
      相關.Net教程