3

我正在使用 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')

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

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

4

2 回答 2

3

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

例如,由于@user.name返回 a ,默认情况下String您只能在其上调用属于该类的方法。String如果要在其上调用其他方法,则要么要使用 的子类String,要么要向 的特定实例添加一些单例方法String。我认为这会令人困惑和不一致,并且可能会阻碍真正的进展。

一个更好的解决方案是问类似的问题:

@user.valid?(:name)

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

@user.surname.include?('V')
于 2012-04-30T03:09:06.630 回答
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"
于 2012-04-30T03:26:57.273 回答