当我使用元编程定义时,NoMethodError

时间:2016-05-16 14:19:37

标签: ruby metaprogramming

我正在研究一些代码。我正在尝试使用我创建的gem打印样本颜色列表,并抛出NoMethodError 我正在打开String类,我正在这样做。

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 个答案:

答案 0 :(得分:2)

问题在于

  

将“这是#{color}” .color

您基本上每次都会调用颜色方法。 Ruby并不关心你有一个名为color的局部变量。

您想将sample_colors定义为:

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

send方法将调用对象上给定字符串/符号表示的方法名称。

答案 1 :(得分:0)

您正在调用方法color而不是颜色的名称。试试这个:

puts "This is #{color}".send(color.to_sym)