Ruby特殊用法CASE语句

时间:2016-08-27 10:00:41

标签: ruby-on-rails ruby switch-statement metaprogramming

我有一些代码:

variable = ...
case variable
when ~:new
  ':new method!'
when ~:lenght
  ':size method!'
end

对于o = [],它应该去大小写并返回':size method!' 对于o = String应返回':new method' 这部分我知道如何实现(我的解决方案如下) 但它应该适用于任何类型的对象。而这部分我不知道如何实施。我不知道我的代码有什么问题,是不是正确的?我的代码:

module AbstractClass
  def new; false end;
  def size; false end;
end

class Class
  include AbstractClass
end

class Array
  include AbstractClass
  def size; true end;
end

class String
  include AbstractClass
  def new; true end;
end

class Symbol
  include AbstractClass
  alias ~ to_proc
end

谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我知道你在这里做了什么:)我可以给你一个提示。

重要的是了解案例陈述在Ruby中的工作原理。如果您有以下代码:

case variable
when 1
  # do stuff
when "foo"
  # do other stuff
end

Ruby实际上是在这些值上调用===方法:

1 === variable
"foo" === variable

或者

1.===(variable)
"foo".===(variable)

订单在这里很重要。由于这些只是方法,您可以为任何对象覆盖它们,以提供与比较两个对象相关的一些自定义行为。

def MyClass
  def ===(other)
    # do my own comparison
  end
end