2016-08-12 65 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 
相关问题