我正在使用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')
有可能吗?如果是这样,我该如何做到?
注意:我正在尝试实现一个插件。
答案 0 :(得分:3)
为了做到这一点,你必须为每个属性使用一种特殊类型的类,恕我直言,这将是非常过分的,假设你的理由纯粹是关注视觉风格。
例如,由于@user.name
返回String
,因此默认情况下只能调用属于String
类的方法。如果要在其上调用其他方法,则要么使用String
的子类,要么将一些单例方法添加到String
的特定实例中。我认为这会令人困惑和不一致,并可能妨碍实际进展。
更好的解决方案就是问一下:
@user.valid?(:name)
对于has_char?('V')
,您已经可以使用String
@user.surname.include?('V')
答案 1 :(得分:0)
我刚刚玩了一个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"