解析.NET程序員 Ruby核心語法入門(5)_.Net教程
推薦:關于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
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-解析.NET程序員 Ruby核心語法入門(5)
。