2016-05-16 42 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它的作品,我只是不知道爲什麼,工程和這個人是不是

回答

2

問題是與

提出「這是#{}色」 。顏色

你基本上調用一個方法,每次顏色。 Ruby不關心你有一個稱爲color的局部變量的事實。

你要定義sample_colors爲:

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

send方法將調用對象上給定的字符串/符號所表示的方法名稱。

+0

非常感謝。我被困在這裏像一個小時。 –

+0

作爲最佳做法,您應該使用'public_send'而不是'send'。 –

0

您正在調用方法color而不是顏色的名稱。試試這個:

puts "This is #{color}".send(color.to_sym) 
相關問題