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=完全放弃,你会得到一个something有别名的setter old_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 回答