是否可以在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
之类的快捷方式之间的链接,以及是否可以创建新的快捷方式。
答案 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
语法突出显示使代码看起来破碎,但事实并非如此。