【问题标题】: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"