【发布时间】:2026-01-26 13:20:08
【问题描述】:
我正在为 ruby gem 编写一些测试...
如何检查对象是否响应? MyObject#attr_reader :my_property 但不是 MyObject#attr_writer :my_property 或 MyObject#my_property(value) #
大量示例只是检查所有内容,但。有什么想法吗?
【问题讨论】:
标签: ruby metaprogramming
我正在为 ruby gem 编写一些测试...
如何检查对象是否响应? MyObject#attr_reader :my_property 但不是 MyObject#attr_writer :my_property 或 MyObject#my_property(value) #
大量示例只是检查所有内容,但。有什么想法吗?
【问题讨论】:
标签: ruby metaprogramming
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 方法已设置。
【讨论】:
检查吸气剂: my_object.respond_to? :the_property
检查设置器: my_object.respond_to? :the_property=
【讨论】: