1

Person クラス (名前、年齢) を定義しました。@age インスタンス変数で += 演算子をオーバーロードしようとしましたが、うまくいきませんでした。ここで私のスクリプトの試み:

class Person

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

    def age+= (value)
        @age += value
    end

    def to_s
        return "I'm #{@name} and I'm #{@age} years old."
    end
end

laurent = Person.new "Laurent", 32
puts laurent
laurent.age += 2
puts laurent

そして、これは私が端末に持っているエラーです:

person.rb:8: syntax error, unexpected tOP_ASGN, expecting ';' or '\n'
    def age+= (value)
             ^
person.rb:15: syntax error, unexpected keyword_end, expecting $end

それで、何が問題なのですか?

前もって感謝します。これがあまりにも明白な質問である場合は申し訳ありません。

4

2 に答える 2

3

+代わりに演算子を定義する必要があり、+=自動的に取得されます。

ただし、この場合、+演算子をオーバーライドする必要はありません。ageメンバーは単なる数字なので、すでにすべてが定義されています。あなたが見逃しているのはattr_accessor.

class Person
    attr_accessor :age

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

    def to_s
        return "I'm #{@name} and I'm #{@age} years old."
    end
end

laurent = Person.new "Laurent", 32
puts laurent
laurent.age += 2
puts laurent

+クラスを数値のように動作させ、次のように直接追加できるようにする場合にのみ、演算子をオーバーライドする必要があります。

laurent = Person.new "Laurent", 32
laurent += 2

しかし、この場合、私の意見ではあまり読みやすいとは言えません。

于 2012-10-14T09:49:26.303 に答える
2

@detunized で述べたように、 + 演算子をオーバーロードして += 演算子を自動的に取得する必要があります。

さらに、オペレーター定義にはクラスの名前を含めないでください。

def +(value)
    @age + value
end
于 2012-10-14T09:52:22.900 に答える