【问题标题】:Ruby special usage of CASE StatementCASE 语句的 Ruby 特殊用法
【发布时间】:2016-08-27 10:00:40
【问题描述】:

我有一些代码:

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

对于o = [],它应该转到 size 大小写并返回 ':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

感谢您的帮助!

【问题讨论】:

  • 您可以使用缩进或使用编辑器中的{} 按钮来格式化。
  • 我不太明白你想要达到什么目的。这一切的目标是什么?
  • 这是练习,我给你写了练习的要点。有一些自动化测试表明我的代码不够正确。据说for Array 应该返回':size method!',for String ':new method!'它应该适用于任何一种方法。我知道的就这些
  • 好吧...这是一个练习,我明白了。其他对象的预期输出是什么?
  • monkey-patch 的顶级类不是Class,而是Object。在此处包含您的模块,它将影响任何类的每个实例。 (也有BasicObject,但Object 可以。)然后您不需要将它包含在Array 中,只需覆盖其中一种方法即可。

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


【解决方案1】:

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

重要的是理解 case 语句在 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

【讨论】:

  • 我知道你的意思,但是如何为所有类型的对象覆盖这些方法呢?在 Class 类中覆盖这个?
  • 我相信这个任务的测试用例比这两种方法更复杂:new 和 :length。您应该编写适用于任何方法名称的更通用的解决方案
  • 是的,有一些自动化测试,但我不知道它们是什么样子的。我在练习中有一些带有开关盒的代码,仅此而已。我的解决方案适用于我定义 new 和 length 但 it should work with any kind of object. 的对象。我认为应该有一些偷偷摸摸的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多