如何实现“直接”对象属性的方法?

时间:2012-04-30 02:50:43

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

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

有可能吗?如果是这样,我该如何做到?

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

2 个答案:

答案 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"