ruby - Ruby setter 的返回值
问题描述
我读到这attr_writer :age
是简写:
def age=(value)
@age = value
end
所以我创建了一个具有如下函数的类:
def age=(value)
if @age == -1
@age = value
return true
end
return false
end
然后我想在另一个地方这样称呼它:
rv = Foo.age(1)
# do stuff with rv
但我收到一个错误:
ArgumentError:
wrong number of arguments (given 1, expected 0)
无论如何,我可以做类似的事情,Foo.age = 1
但这并不能让我控制返回值。这里正确的惯用 Ruby 是什么?
解决方案
一个执行两个步骤的包装器方法怎么样:首先它会尝试设置值age=
然后验证它age == new_value
并返回,这样你就可以知道设置器是否成功。
class Foo
def age=(val)
# do a bunch of complicated networking that was non-deterministic
# return true/false
end
def set_age(val)
self.age = val
@age == val
end
end
foo = Foo.new
result = foo.set_age(1)
您还可以通过引发错误来替换 true/false,然后您可以将 setter 包装到 begin-end 块中
class Foo
def age=(val)
# do a bunch of complicated networking that was non-deterministic
raise RuntimeError
end
end
result = begin
foo.age = 1
true
rescue => e
false
end
推荐阅读
- npm - NPM 初始化和启动
- docker - 大文件的最佳 kubernetes 存储选项
- php - Laravel 忽略 env 和 config 文件
- xamarin.forms - 在 Xamarin.Forms 中使用 MailKit 发送电子邮件时出现 System.MissingMethodException
- azure - Azure 是否解释了资源的 API 版本更新?
- c - 单个 malloc 中的多个结构调用未定义的行为?
- php - 为什么我的弹性搜索有问题,无法搜索某些东西?
- python - 在 imputer 之后添加删除的列
- c# - 为什么 Unity 中的滑块变得非交互
- r - 计算每个字母出现的总次数,然后计算每个字母出现的概率?