1
class Test
  attr_accessor :something
end

class Test
  alias :old_something= :something=
  def something=(a)
    a += 2              # do something with the argument
    old_something=(a)   # then pass it on
  end
end

と言ったら期待したい

t = Test.new
t.something = 3
puts t.something

印刷され5ます。しかし、それは印刷されnilます。これが機能しないのはなぜですか?

4

3 に答える 3

2

フォーム

foo = bar

ローカル変数に割り当てます。メソッドを呼び出すことを明示する必要があります。

self.foo = bar
于 2013-03-10T21:05:10.607 に答える
0

編集:@Jörgの答えはおそらく本当の問題ですが、以下の私の元の答えも役立つかもしれません。私の古い回答から誤解を招く詳細を編集しました。

を完全に削除すると、次のエイリアスを持つdef something=セッターが得られます。somethingold_something

class Test
  attr_accessor :something
end

class Test
  alias :old_something= :something=
end


1.9.3p327 :001 > require "./test.rb"
=> true
1.9.3p327 :002 > t = Test.new
=> #<Test:0x000000018eb740>
1.9.3p327 :003 > t.something = "blah"
=> "blah"
1.9.3p327 :004 > t.something
=> "blah"
1.9.3p327 :005 > t.old_something = "moo"
=> "moo"
1.9.3p327 :006 > t.something
=> "moo"
于 2013-03-10T21:04:05.013 に答える
0

その理由は、@something が何にも割り当てられないためです。

このコードは、あなたがやろうとしていることを行います:

class Test
  attr_accessor :something
end

class Test
  alias :old_something= :something=
  def something=(a)
    @something = a += 2 # do something with the argument
    old_something=(a)   # then pass it on
  end
end

t = Test.new
t.something=( 3)
puts t.something

違いは、インスタンス変数 @something を値にa代入し、渡された変数によってコードがそれをインクリメントできるようにすることでした。

于 2013-03-10T21:10:13.690 に答える