0

Ruby初心者です。Why's Poignant Guide の例に混乱しています。

引数として渡されるため、次の例のpicksinの使用 (これも心に訴えるガイドから) を理解しています。initialize

class LotteryTicket

  NUMERIC_RANGE = 1..25

  attr_reader :picks, :purchased

  def initialize( *picks )
    if picks.length != 3
      raise ArgumentError, "three numbers must be picked"
    elsif picks.uniq.length != 3
      raise ArgumentError, "the three picks must be different numbers"
    elsif picks.detect { |p| not NUMERIC_RANGE === p }
      raise ArgumentError, "the three picks must be numbers between 1 and 25"
    end
    @picks = picks
    @purchased = Time.now
  end

end

initializeしかし、次の例では、引数として渡されpicksずに使用を開始するにはどうすればよいでしょうか? picksここでnote1, note2, note3は、代わりに渡されます。それはどのようにしてに割り当てられpicksますか?

class AnimalLottoTicket

      # A list of valid notes.
      NOTES = [:Ab, :A, :Bb, :B, :C, :Db, :D, :Eb, :E, :F, :Gb, :G]

      # Stores the three picked notes and a purchase date.
      attr_reader :picks, :purchased

      # Creates a new ticket from three chosen notes.  The three notes
      # must be unique notes.
      def initialize( note1, note2, note3 )
        if [note1, note2, note3].uniq!
          raise ArgumentError, "the three picks must be different notes"
        elsif picks.detect { |p| not NOTES.include? p }
          raise ArgumentError, "the three picks must be notes in the chromatic scale."
        end
        @picks = picks
        @purchased = Time.now
      end
end
4

2 に答える 2

1

そのコードにはエラーがあります。irbで実行すると、次のようになります。

NoMethodError: undefined method `detect' for nil:NilClass

ここには 2005 年からの議論があります。initialize の先頭に次のコードを記述すれば、彼らが探していたものが得られるでしょう。

picks = [note1, note2, note3]
if picks.uniq!
于 2013-08-08T18:16:05.280 に答える
0

ここでpicksは、ローカル変数ではありません。によって定義されたメソッドattr_reader :picks, :purchasedです。このメソッドは、インスタンス変数の値を呼び出します@picks。これ@picks = picksは、@picks = @picksその値をそれ自体に代入しているため、何の効果もありません。Rubyに詳しくない人が書いたと思います。

于 2013-08-08T17:48:43.060 に答える