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