2016-05-16 4 views
0

私はいくつかのコードを作成しています。私は作成した宝石を使ってサンプルカラーのリストを印刷しようとしています。NoMethodError 私はStringクラスを開いています。メタプログラミングを使用して定義したNoMethodError

def self.sample_colors 
    @@colors_arr.each do |color| 
    puts "This is #{color}".color 
    end 
end 

は、それは.colorが今までので、最初のループはそうで.red、その後.blueとなりました配列を色に変更する必要がありますので、作業をすることになっています。 このコードでは、各色のメソッドを作成しています。

def self.create_colors 
    @@colors_arr.zip(@@color_codes).each do |color,code| 
    self.send(:define_method,color) do 
    "\e[#{code}m#{self}\e[0m" 
    end 
    end 
end 

編集:私は.redを使用するか、.blueそれが動作する場合、それは動作しますなぜ私はちょうど得ることはありませんし、この1つは

答えて

2

ないという問題が

プットである「これは#{カラー}です」 .colorあなたは基本的に方法たびに呼び出している

。 Rubyは、colorというローカル変数を持っているという事実を気にしません。あなたがsample_colorsを定義したい

def self.sample_colors 
    @@colors_arr.each do |color| 
    puts "This is #{color}".send(color) 
    end 
end 

sendメソッドは、オブジェクトに与えられた文字列/記号で表されるメソッド名を呼び出します。

+0

ありがとうございます。私はここのように1時間ほど立ち往生した。 –

+0

ベストプラクティスとして、 'send'の代わりに' public_send'を使うべきです。 –

0

色の名前の代わりにcolorメソッドを呼び出しています。試してみてください:

puts "This is #{color}".send(color.to_sym) 
関連する問題