以下代码有效:
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
但它不起作用。有一种聪明的方法吗?如何获取方法名称并在案例块中使用它?
答案 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
人们告诉我使用模块而不是修补核心课程,但对于个人用途,我认为是好的。