2016-08-12 11 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.CitizenDublin.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 
関連する問題