class Test
def var=(var)
@var = var
return true
end
end
t1, t2 = Test.new, Test.new
t1.var = 123 # evaluates to 123
# Why is it impossible to return something else:
t1.var = t2.var = 456
正如评论说:我认为这是不可能的,以允许链式任务改变返回值。无论如何,更改返回值可能会让大多数Ruby程序员感到意外。
声明:我测试了上面的代码,但没有找到明确的引用来验证我的声明。
更新
class Test
def method_missing(method, *args)
if method == :var=
# check something
@var = args[0]
return true
else
super(method, *args)
end
end
def var
@var
end
end
t = Test.new
t.var = 123 # evaluates to 123
t.does_not_exists # NoMethodError
这似乎真的是不可能的!上面的示例表明返回值完全与var=
方法无关。你不能改变这种行为 - 这是Ruby分配工作的基本方式。
更新2:发现的解决方案
你也可以抛出一个异常!
class Test
def var=(var)
raise ArgumentError if var < 100 # or some other condition
@var = var
end
def var
@var
end
end
t = Test.new
t.var = 123 # 123
t.var = 1 # ArgumentError raised
t.var # 123
你能提供一个什么样的检查的例子吗?我有点迷失你的意思。但我有预感,这很可能,只需要一些澄清。 – mwilliams 2008-10-13 14:10:59
仅仅因为有可能,并不意味着这是一个好主意。 ;) – epochwolf 2008-10-13 14:12:35
引发异常绝对是做这件事的红宝石方式。 – rampion 2009-04-08 19:32:26