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​​ 如何在内部建立快捷方式(如{}and )之间的链接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 回答