2012-12-15 90 views
1

是否有可能創建快捷方式來實例化Ruby中的自定義類?Ruby:類實例化的快捷方式

例如,對於散列的如下一個子類:

class MyHash < Hash 
    # some custom methods 
end 

MyHash實例可以像創建:

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

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

即足夠細,但我想知道是否有方法來定義新的快捷方式,如:

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

更新:

爲目標似乎不清楚,我這裏主要考慮的是瞭解如何紅寶石內部建立一個快捷方式之間的聯繫,像{}Hash.new,如果有可能創造新的快捷方式。

+0

我沒有看到您想要的快捷方式的好處。 – Zach

+0

我同意,但我只是想知道這是可能的。 – Eric

+1

Ruby語法的一部分可以被覆蓋(例如,':+'和':=='),而部分則不能。我認爲'{}'屬於第二類。但是請參閱Rubinius的Ruby實現,以便將更多的運行時暴露給可能的修改。 –

回答

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"]

+0

整潔!快捷鍵的意思是理解'{}'如何被解釋爲'Hash.new'或'[]','%w()','%W()'作爲'Array.new',有可能創建自定義的。 (比任何實際需要都更好奇) – Eric

1

您可以利用這個事實,即您可以重寫反引號操作符,以獲得與您請求的某種類似的解決方案。但我真的不建議做類似的東西:)

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

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

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

語法高亮使得代碼看起來壞了,但事實並非如此。

+0

我肯定會避免這種情況,但這確實是一個有趣的技巧! :) – Eric