1

次のコードが機能します。

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

しかし、うまくいきません。これを行うスマートな方法はありますか?メソッド名を取得して case ブロックで使用するにはどうすればよいですか?

4

2 に答える 2

2

あなたが探していると思うので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

class String
  def self.color_mapping
    {
      red: 91,
      blue: 100
    }
  end

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

  color_mapping.each do |c, v|
    define_method(c) do
      color(v)
    end
  end

  def method_missing(name, *args)
    send(:color, 0)
  end
end
于 2015-07-26T22:50:02.753 に答える