获取方法名称

时间:2015-07-26 22:39:49

标签: ruby method-names

以下代码有效:

class String
  def color(code)
    "\e[#{code}m#{self}\e[0m"
  end
end

puts "Anything".color(93)

我希望能够做到:

puts "Anything".red

red作为字符串捕获,然后按如下方式将其提供给case-block:

class String
  case **?WHAT?**       
  when "red" then color(91)
  else color(0)
  end
end

但它不起作用。有一种聪明的方法吗?如何获取方法名称并在案例块中使用它?

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找var buttonState = document.getElementById("clickMe"); var maxArea = document.getElementById("page"); var pageWidth = maxArea.width; var pageHeight = maxArea.height; var screenWidth = 0; var screenHeight = 0; var buttonSize = 4; ,我已在下面提供了解决方案。这非常适合学习,但如果您正在使用生产代码库,那么您可能不希望使用method_missing添加String补丁!

method_missing

以下是使用class String def color(code) "\e[#{code}m#{self}\e[0m" end private def method_missing(name, *args) return send(:color, 91) if name == :red send(:color, 0) end end p "Anything".red # => "\e[91mAnything\e[0m" p "Anything".color(93) # => "\e[93mAnything\e[0m" p "Anything".magenta # => "\e[0mAnything\e[0m" 解决问题的另一种方法:

define_method

答案 1 :(得分:0)

感谢您的努力。我找到了一个基于你最后一个代码片段的解决方案,并且在这里和那里有点问:

class String
  def color(code)
    "\e[#{code}m#{self}\e[0m"
  end

  colors = { black: 30, red: 31, green: 32, orange: 33, blue: 34, purple: 35, cyan: 36, gray: 37, white: 97,
             lgray: 90, lred: 91, lgreen: 92, yellow: 93, lblue: 94, lpurple: 95, lcyan: 96 }
  colors.each {|name, value| define_method(name) do; color(value); end; }

end

正如您所看到的,我没有捕获方法的名称,而是使用哈希通过'define_method'创建定义。它比使用大小写块的代码小得多,读起来也不错。 :d

人们告诉我使用模块而不是修补核心课程,但对于个人用途,我认为是好的。

相关问题