ruby基本語法(2)

用了半天的命令行,我快受不了了,趕快祭出我的Eclipse。

創建一個ruby工程。

然後創建一個ruby class。我參考的例子中把類名字叫ri20min.rb,可能是20分鐘體驗的意思吧。

名字無所謂,打開新創建的文件,我們會發現下面這些內容:

if __FILE__ == $0
end
__FILE__是一個“具有魔力”的變量,它代表了當前文件名。$0是用於啓動程序的文件名。那麼代碼“if __FILE__ == $0”便意味着檢查此文件是否爲將被使用的主程序文件。這樣做可以使程序文件作爲代碼庫使用,而不是可執行代碼;但當此文件被用作執行文件時,也可被執行。

名字無所謂,打開新創建的文件,我們會發現下面這些內容:

#!/usr/bin/env ruby

class MegaGreeter
  attr_accessor :names

  # 初始化這個物件
  def initialize(names = "World")
    @names = names
  end

  # 向每個人說 hi
  def say_hi
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("each")

      # @names 是可以迭代的數組容器
      @names.each do |name|
        puts "Hello #{name}!"
      end
    else
      puts "Hello #{@names}!"
    end
  end

  # 向每個人說 bye
  def say_bye
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("join")
      # 用逗號將數組中的元素串接成一個字符串
      puts "Goodbye #{@names.join(", ")}.  Come back soon!"
    else
      puts "Goodbye #{@names}.  Come back soon!"
    end
  end

end

if __FILE__ == $0
mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # 變更成 "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # 變更成一個名字的數組
  mg.names = ["Albert", "Brenda", "Charles",
    "Dave", "Englebert"]
  mg.say_hi
  mg.say_bye

  # 變更成 nil
  mg.names = nil
  mg.say_hi
  mg.say_bye

end
控制檯輸出如下:

Hello World!
Goodbye World.  Come back soon!
Hello Zeke!
Goodbye Zeke.  Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert.  Come back soon!
...
...
程序中有一些對我來說是新的知識,自己記錄一下學習過程:

#對於ruby來說是註釋符號,但是對於文件頂部的#卻有另外的含義:

 

在 Unix-like 操作系統下這告訴 Shell 如何執行這個檔案。其餘的批註則用來說明程序。

if @names.nil?
判斷對象是否爲空。

 elsif @names.respond_to?("each")
判斷@names是否爲可以迭代的數組容器。這些語句簡直堪稱經典。

如果對象可以會用each方法,則表示你可以對他進行迭代,一邊我們對其中的元素進行操作。 

@names.each do |name|
        puts "Hello #{name}!"
      end
each是可以接受程序塊的方法,對其中的每一個元素應用方法塊。也就是do end之間的部分,是一個匿名方法,有點像lambda表達式。

兩個|之間的部分就是匿名方法的參數,這個參數會被輪流指定爲數組內的每一個元素,然後執行方法快。

這個對應java的索引循環for

    elsif @names.respond_to?("join")
      # 用逗號將數組中的元素串接成一個字符串
      puts "Goodbye #{@names.join(", ")}.  Come back soon!"
    else
      puts "Goodbye #{@names}.  Come back soon!"
    end
這段代碼就更閃光了。類似於上面的@names.respond_to?("each"),

say_bye 方法沒有用到 each,而是檢查 @names@ 是不是可以響應 join 方法。如果可以,就呼叫它。

不然它就把它當做字符串輸出。這個方法並不在乎變量真正的型別(type),而只關心變量是不是可以響應支持某個方法,

這種風格叫做 “鴨子型別(Duck Typing)”,意義就是 “如果它走起來像鴨子,叫起來也像鴨子,那就當它是鴨子”。

這種思維的好處是它不會被變量的型別所限制。如果有人寫了新的容器類別,並且也實作了 join 這個方法,

那麼我們就可以在這裏使用它。

是不是比java這種強類型檢驗靈活的多呢?

到這,初體驗就差不多告一段落了,下一節來感受一下java與Ruby在語言上的異同。

發佈了19 篇原創文章 · 獲贊 11 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章