學習一下Ruby的基本語法(1)

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不太適合寫比較複雜比較長的程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章