Ruby on Railsの旅(四)--Rubyの基本文法を勉強します(2)


半日の命令でいいです.もう我慢できません.早くEclipseを祭ってください.
rubyエンジニアリングを作成します.
次にruby classを作成します.私が参考にした例ではクラス名をri 20 minと言います.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オペレーティングシステムの下で、シェルにこのファイルを実行する方法を教えます.残りのコメントはプログラムを説明するために使用されます.
if @names.nil?

対象が空かどうかを判断します.
 elsif @names.respond_to?("each")

@namesが反復可能な配列コンテナであるかどうかを判断します.これらの言葉はまるで経典と言える.
オブジェクトがeachメソッドを使用できる場合は、要素を操作しながら反復できることを示します.
@names.each do |name|
        puts "Hello #{name}!"
      end

eachは、プログラムブロックを受け入れる方法であり、その各要素にメソッドブロックを適用する.つまりdo endの間の部分は、lambda式に似た匿名の方法です.
2つの|の間の部分は匿名メソッドのパラメータであり、このパラメータは配列内の各要素として順番に指定され、メソッドの実行が速い.
この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)を気にせず,変数がある方法をサポートすることに応答できるかどうかだけに関心を持つ.
このスタイルは「ダックタイプ」と呼ばれ、「アヒルのように歩き、アヒルのように鳴くなら、アヒルだと思ってください」という意味です.
このような思考の利点は、変数の型に制限されないことです.誰かが新しい容器カテゴリを書いてjoinという方法も実際に作ったら、
ここで使えます
Javaのような強いタイプよりも柔軟なのではないでしょうか.
ここまで来て、初体験はもう一段落していないので、次の節ではjavaとRubyの言語上の異同を感じてみましょう.