Ruby:类实例化的快捷方式

时间:2012-12-15 00:32:03

标签: ruby

是否可以在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之类的快捷方式之间的链接,以及是否可以创建新的快捷方式。

2 个答案:

答案 0 :(得分: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"]

更短

答案 1 :(得分:1)

您可以利用这一事实,即您可以覆盖反引号操作符,以获得与您请求的内容有些类似的解决方案。但我真的不建议做那样的事情:)

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

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

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

语法突出显示使代码看起来破碎,但事实并非如此。