【问题标题】:How to implement methods that act "directly" on object attributes?如何实现“直接”作用于对象属性的方法?
【发布时间】:2012-05-09 19:34:00
【问题描述】:

我正在使用 Ruby on Rails v3.2.2,我想在实例属性上“直接”调用方法,而不是在其接收器对象上。也就是说,如果我有一个 User 实例 @user

@user.name
# => "Leonardo da Vinci"

我将能够实现“直接”作用于name 属性的方法,这样我就可以编写类似的东西

# Note: 'is_correct?' and 'has_char?' are just sample methods.
@user.name.is_correct?
@user.surname.has_char?('V')

有可能吗?如果是这样,我该怎么做?

注意:我正在尝试实现一个插件。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 methods attributes


    【解决方案1】:

    为了做到这一点,您必须为每个属性使用一种特殊类型的类,恕我直言,假设您的原因纯粹是出于对视觉风格的关注,这将是非常过分的。

    例如,由于@user.name 返回一个String,默认情况下您只能在其上调用属于String 类的方法。如果您想在其上调用其他方法,您可以使用String 的子类,或者将一些单例方法添加到String 的特定实例中。我认为这会令人困惑和不一致,并且可能会妨碍真正的进步。

    更好的解决方案是询问以下内容:

    @user.valid?(:name)
    

    至于has_char?('V'),您已经可以使用String 的实例来做到这一点:

    @user.surname.include?('V')
    

    【讨论】:

      【解决方案2】:

      我刚刚玩了一个 lil 并在普通类中使用单例方法让它工作,我不确定是否可以在你的情况下做同样的事情。我对此表示怀疑!但仍然是我得到的:)

      class Bar
      
        def initialize foo
          @foo = foo
          def @foo.bar 
            p "baaaaaaar"
          end
        end
      
        def foo
          @foo
        end
      
        def foo=(foo)
          @foo = foo
          def @foo.bar 
            p "baaaaaaar"
          end
        end
      end
      
      a = Bar.new "foo"
      p a.foo
      p a.foo.bar
      a.foo = "bar"
      p a.foo.bar
      # >> "foo"
      # >> "baaaaaaar"
      # >> "baaaaaaar"
      # >> "baaaaaaar"
      # >> "baaaaaaar"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        相关资源
        最近更新 更多