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

これを行うには、属性ごとに特別なタイプのクラスを使用する必要があります。これは、理由が純粋に視覚スタイルに関係していると仮定すると、IMHOでは非常にやり過ぎです。

たとえば、はを@user.name返すため、デフォルトではクラスに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 に答える