2016-08-12 67 views
1

我想有一個更大範圍的括號。爲了讓一個想法,我已經可以修改普通括號:我可以在Ruby中創建替代括號嗎?

class City 
def initialize(city:) 
    @city = city 
end 

def [](man) 
    print "I am #{man} of #{city}" 
end 
end 

所以我可以做:

paris = City.new city: "Paris" 
paris["George"] # ==> I am George of Paris 

但現在我想補充新的括號像這樣:

class City 
def initialize(city:) 
    @city = city 
end 

def [M M](man) 
    print "I am man: #{man} of #{city}" 
end 

def [W W](woman) 
    print "I am woman: #{woman} of #{city}" 
end 
end 

所以我可以這樣做:

paris = City.new city: "Paris" 
paris[M "George" M] # ==> I am man: George of Paris 
paris[W "Lisa" W] # ==> I am woman: Lisa of Paris 

這可能嗎?怎麼樣?

+2

不,這是不可能的。 '[]'是一種方法,不是魔術。 – mudasobwa

+0

不管怎樣,你都不應該使用方括號。方括號用於索引對象,例如從數組中檢索元素。只要使用一個常規方法:'paris.say(「George」,:man)#我是男人:巴黎的喬治' –

+0

當然德文,這只是一個例子,以澄清這個想法。我的問題只是爲了瞭解Ruby的彈性。 – Stefano

回答

1

有辦法做到這一點,但像其他人說的,你不應該這樣做。

class City 
    def initialize(city:) 
     @city = city 
    end 

    def [](type, name) 
    if type == :m 
     print "I am man: #{name} of #{city}" 
    else 
     print "I am woman: #{name} of #{city}" 
    end 
    end 
end 

city = City.new('Paris') 
city[:m, 'George'] 
0

您通常使用參數化子類來做到這一點。您首先創建代表一般人的Human類,然後告訴每個城市包含參數化子類HumanLondon.Citizen,Dublin.citizen)。在這些示例中,我將使用YSupport gem(gem install y_support)來縮短代碼,但您也可以使用普通Ruby輕鬆實現此行爲。對於每個城市創建的Human一個參數化的子類,代表城市的公民

require 'y_support/all' 

class Human 
    ★ NameMagic 
    selector :sex 
    def self.male; new :m end 
    def self.female; new :f end 
    def initialize sex; @sex = sex end 
end 

class City 
    ★ NameMagic 
    delegate :male, :female, to: "self.Citizen" 
    def initialize 
    param_class({ Citizen: Human }, with: { city: self }) 
    class << self.Citizen 
     def introduce_self 
     "I am a #{{m: :man, f: :woman}[sex]} from #{city}." 
     end 
    end 
    end 
end 

param_class方法:

London, Paris = City.new, City.new 
Tom = London.male 
Lisa = Paris.female 
相關問題