http://my.oschina.net/jing31/blog/6521
感覺挺容易上手的。自己學着敲一便,有一個感性認識。語言是需要實踐的學習過程的。
我們用irb這種交互式的工具來學習Ruby語言。
使用方法很簡單,打開command窗口,輸入irb,看到下面的提示符就表示成功打開了irb環境。
irb(main):001:0>
1)來一個世界上最簡單的輸出:
irb(main):001:0> "hello world" => "hello world"
2)IRB 告訴我們最後的敘述執行結果。如果我們需要輸出 “Hello World” 還需要多一行:
irb(main):002:0> puts "hello world" hello world => nil
puts 是 Ruby 的基本輸出指令。但是什麼是 => nil 呢? 那是那一行敘述的執行結果。 puts 總是回傳 nil,nil 在 Ruby 中表示一個絕對的空值。
3)接下來把irb當計算機來用一用
irb(main):003:0> 3*23 => 69 irb(main):004:0> 3**2 => 9 irb(main):005:0> 3.sqrt NoMethodError: undefined method `sqrt' for 3:Fixnum from (irb):5 from (null):0 irb(main):006:0> Math.sqrt(2) => 1.4142135623731 irb(main):007:0>
*是乘法,**是乘方,sqrt是方根。方根的使用不能寫成“3.sqrt”,要用Math Modules來實現。
irb(main):011:0> a = 3**2 => 9 irb(main):012:0> b = 4**2 => 16 irb(main):013:0> Math.sqrt(a+b) => 5.0
再試驗一下Math Modules,當然裏面還有其他的如sin tan等計算方法,這裏不做更多試驗了,需要的時候再查文檔即可。
4)下面準備些一個方法,一邊重複執行hello world方法。
irb(main):016:0> def hello irb(main):017:1> puts "hello world" irb(main):018:1> end
很簡單,用def和end來表明方法範圍。
如果一行只有一條執行語句則不需要結束符。
Ruby 迴應 => nil 告訴我們它知悉了這個方法定義。
5)既然定義了方法,那麼就調用一下看看吧。
irb(main):019:0> hello hello world => nil irb(main):020:0> hello() hello world => nil
因爲方法沒有參數,所以可以省略()。
返回結果nil對於我這個學java的來說有點不太適應。O(∩_∩)O~
6)接下來進一步修改方法,讓他可以對某個人說hi。也就是給方法加參數。
irb(main):025:0> def hello(name) irb(main):026:1> puts "hello #{name}" irb(main):027:1> end => nil irb(main):028:0> hello("jack") hello jack => nil
這裏說明一下單引號和雙引號的區別(當構造字符串文本時):
單引號不對字符串做任何處理(及特殊情況除外)。
雙引號則會查找其中的替換串(substitution)--以反斜槓開頭的字符序列,並將其替換成對應的二進制值。比如\n會被替換成回車。
表達式插補(expression interpolation),#{expression }序列會被替換成expression 表達式的值,就如上面的例子中#{name}被替換成name表達式的值“jack”。
7)字符串內聯
irb(main):029:0> def hello(name) irb(main):030:1> puts "hello #{name.capitalize}" irb(main):031:1> end => nil irb(main):032:0> hello("jack") hello Jack => nil
很明顯,替換序列中准許寫複雜表達式的。這裏通過表達式將傳入參數的首字母變成了大寫。
Ruby中一切皆對象,對象.方法名是比較常用的使用方法。
8)給方法參數加個默認值看看
irb(main):001:0> def hello(name= "world") irb(main):002:1> puts "hello #{name}" irb(main):003:1> end => nil irb(main):004:0> hello "jack" hello jack => nil irb(main):005:0> hello hello world => nil
在沒有傳遞任何參數的情況下,name使用了默認值world。
這裏體現了另外一個語法細節,省略調用方法的括號。
9)創建一個接待員,來學習方法內部變量及方法的使用方法。
irb(main):007:0> class Greeter irb(main):008:1> def initialize(name = "world") irb(main):009:2> @name = name irb(main):010:2> end irb(main):011:1> def say_hi irb(main):012:2> puts "hi #{@name}" irb(main):013:2> end irb(main):014:1> def say_bye irb(main):015:2> puts "bye #{@name}, come back soon." irb(main):016:2> end irb(main):017:1> end => nil
在Greeter初始化的時候,給實例變量@name進行賦值,默認值爲“world”,並且定義了say_hi和say_bye兩個方法,在方法內可以調用實例變量@name。
創建之後就可以使用這個類了。
irb(main):018:0> g = Greeter.new("jack") => #<Greeter:0x2d959a0 @name="jack"> irb(main):019:0> g.say_hi hi jack => nil irb(main):020:0> g.say_bye bye jack, come back soon. => nil
首先創建一個類的實例g,並且記住了名字jack。然後調用實例的方法say_hi和say_bye。
在創建實例的時候,在返回值上看到了實例變量,我們是否可以直接訪問呢?試驗一下:
irb(main):021:0> g.@name SyntaxError: compile error (irb):21: syntax error, unexpected tIVAR from (irb):21 from :0
看來時不能直接訪問了。說明實例變量是隱藏內class內部的,OO的封裝思想在這裏一覽無餘。
10)我怎麼知道這個類有多少個方式是我可以使用的呢?
irb(main):022:0> Greeter.instance_methods => ["inspect", "tap", "clone", "public_methods", "__send__", "instance_variable_ defined?", "equal?", "freeze", "extend", "send", "methods", "say_hi", "hash", "d up", "instance_variables", "eql?", "object_id", "instance_eval", "id", "singleto n_methods", "say_bye", "taint", "frozen?", "instance_variable_get", "instance_of ?", "to_a", "to_enum", "type", "instance_exec", "protected_methods", "==", "===" , "instance_variable_set", "kind_of?", "respond_to?", "to_s", "hello", "enum_for ", "class", "method", "__id__", "tainted?", "=~", "private_methods", "untaint", "nil?", "display", "is_a?"]
暈,好多,我明明只創建了兩個,一個say_hi一個是say_bye。
這裏是Greeter的所有方法,包括集成自父類的方法等等。想查看自己的方法怎麼看?加一個false就可以了。
irb(main):023:0> Greeter.instance_methods(false) => ["say_hi", "say_bye"]
接下來看看Greeter對哪些方法有反應吧
irb(main):024:0> g.respond_to?("name") => false irb(main):025:0> g.respond_to?("say_hi") => true irb(main):026:0> g.respond_to?("say_bye") => true
看結果就知道了,不需要更多說明了。至於respond_to這個奇妙的方法,後面還有更多妙用,我可能會在後面另起一篇文章來學習一下。
11)上面提到了,實例變量@name是無法直接通過外部訪問的,這不僅讓我想起了java的set,get方法羣,雖然現代IDE工具有很多可以自動生成,但是依然麻煩無比。
讓咱們一起學習一下ruby是怎麼解決這個問題的吧。
修改類:
irb(main):027:0> class Greeter irb(main):028:1> attr_accessor :name irb(main):029:1> end
通過name方法對實例變量(attr)進行訪問。attr_accessor
會定義兩個方法,name用來取值,name=用來賦值。 //很好的東西,用於賦值
irb(main):030:0> g = Greeter.new("jack")#生成類實例 => #<Greeter:0x2e92e40 @name="jack"> irb(main):031:0> g.respond_to?("name")#查看是否有name方法,這個方法相當於java的getXXXX => true irb(main):032:0> g.respond_to?("name=")#查看是否有name=方法,這個方法相當於java的setXXXX => true irb(main):033:0> g.say_hi hi jack => nil irb(main):034:0> g.name = "lily" => "lily" irb(main):035:0> g => #<Greeter:0x2e92e40 @name="lily"> irb(main):036:0> g.name => "lily" irb(main):037:0> g.say_hi hi lily => nil
使用起來比java的setget可方便多了。因爲還沒有使用到IDE工具,如果這部分也可以自動生成當然就更好了。
到此爲止,irb的使用應該熟悉了,也是跟他說byebye的時候了,irb不太適合寫比較複雜比較長的程序。