1

この 1 か月以内に Ruby を学んだばかりで、RSpec を使用して TDD スキルに取り組んでいます。

次のテストに合格しようとしています。

    it "has a modified color" do
    @phone.color = "green"

    puts @phone.color.should == "green"
end

これが私のコードです:

    class Phone

      attr_reader   :name
      attr_reader   :manufacturer
      attr_accessor :color

      def initialize(name, manufacturer)
        @name           = name
        @manufacturer   = manufacturer
      end

      def color(color='black')
        @color = color
      end
    end

私は本質的に次のことをしようとしています:

    phone = Phone.new("Moto X", "Motorola")
    puts phone.color # 'black'
    phone.color = "green"
    puts phone.color # 'green'

ただし、色を緑に再割り当てしようとした後も「黒」が出力されます。助けてください。

ありがとう。

4

1 に答える 1

2

問題は、あなたdef colorが属性リーダーであり、ライターではないことです。blackそのため、パラメータごとに常にデフォルトの色 が返されます。

割り当てを行う場合:

phone.color = "green"

暗黙のライター (によって生成attr_accessor :color) を呼び出しています。属性ライターは次のようになります。

def color=(c)
  @color = c
end

色を「緑」に書き込んだ後、次の方法でアクセスしようとします。

puts phone.color

これにより、属性リーダーが実行されます。

def color(c='black')
  @color=c
end

色を「黒」に設定し、その色を返します。

デフォルトの黒色が必要な場合は、次のようにクラスを定義できます。

class Phone
  attr_reader   :name
  attr_reader   :manufacturer
  attr_accessor :color         # This generates your reader and writer methods

  def initialize(name, manufacturer)
    @name           = name
    @manufacturer   = manufacturer
  end

  def color
    @color || 'black'    # If @color is nil, return 'black', otherwise @color
  end
end

2.0.0-p195 :012 > phone = Phone.new("Moto X", "Motorola")
 => #<Phone:0x9ecc1ac @name="Moto X", @manufacturer="Motorola">
2.0.0-p195 :013 > phone.color
 => "black"
2.0.0-p195 :014 > phone.color = "green"
 => "green"
2.0.0-p195 :015 > phone.color
 => "green"
于 2014-01-31T04:09:08.823 に答える