0

我正在为红宝石宝石编写一些测试......

如何检查对象是否响应?MyObject#attr_reader :my_property 但不是 MyObject#attr_writer :my_property 或 MyObject#my_property(value) # <= setter?

大量示例只是检查所有内容,但。有任何想法吗?

4

2 回答 2

3

attr_reader :my_property本质上是语法糖

def my_property
  @my_property
end

同样,attr_writer :my_property是简写

def my_property=(val)
  @my_property = val
end

注意定义的方法attr_writer以和等号结尾;这意味着 obj.my_property = foo被解释为obj.my_property=(foo); 这就是在 ruby​​ 中定义 setter 的方式,而 getter 只是不带参数并返回值的简单方法。

所以,回到最初的问题。如果obj.respond_to? :my_property返回 true,则意味着它的 getter 已设置。(请注意,由于 getter 只是普通方法,您无法确定该方法实际上是 getter 还是完全不相关的方法)同样如果obj.respond_to? :my_property=返回 true,则表示 setter 方法已设置。

于 2013-05-02T23:55:01.330 回答
2

检查吸气剂: my_object.respond_to? :the_property

检查设置器: my_object.respond_to?:the_property=

于 2013-05-02T23:54:19.780 回答