【问题标题】:How do I check to see if an object respond_to? MyObject#attr_reader :my_property but not setter如何检查对象是否响应? MyObject#attr_reader :my_property 但不是 setter
【发布时间】:2026-01-26 13:20:08
【问题描述】:

我正在为 ruby​​ gem 编写一些测试...

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

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

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    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 方法已设置。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】: