1

Rubyでカスタムクラスをインスタンス化するためのショートカットを作成することは可能ですか?

たとえば、次のようなHashのサブクラスの場合:

class MyHash < Hash
  # some custom methods
end

MyHashインスタンスは、次のように作成できます。

foo = MyHash[ :bar => 'baz' ]

また

foo = MyHash.new
foo[:bar] = 'baz'

それで十分ですが、次のような新しいショートカットを定義する方法があるかどうか疑問に思いました。

foo = my{ :bar => 'baz' }

アップデート:

目標が不明確に思えるかもしれませんが、ここでの私の主な考慮事項は、rubyが内部でとのようなショートカット間のリンクを作成する方法{}Hash.new、新しいショートカットを作成できるかどうかを理解することです。

4

2 に答える 2

2
class MyHash < Hash; end

module Kernel
  def my h; MyHash[h] end
end

できる最善の方法は、中括弧の代わりに括弧を使用するか、中括弧を括弧で囲むことだと思います。

foo = my(bar: "baz")

また

foo = my({bar: "baz"})

とはいえ、あなたの期待がどのような意味で近道なのかはわかりません。私はmy{bar: "baz"}(可能であれば)、またはmy(bar: "baz")それよりも短いとは思わないMyHash[bar: "baz"]

于 2012-12-15T02:38:30.557 に答える
1

バックティック演算子をオーバーライドできるという事実を利用して、要求したものと多少似たソリューションを得ることができます。しかし、私は本当にそのようなことをすることをお勧めしません:)

class MyHash < Hash
  def my_method
    # ...
  end
end

def `(hash)
  MyHash[eval(hash)]
end

foo = `{ :bar => "baz" }`
foo.respond_to? :my_method # => true

構文の強調表示により、コードが壊れているように見えますが、そうではありません。

于 2012-12-15T02:30:42.927 に答える