【问题标题】:Changing the name on this Ruby class causes an error更改此 Ruby 类的名称会导致错误
【发布时间】:2017-02-11 01:05:11
【问题描述】:

我有以下代码,它可以正常运行:

class Array
  def my_name
    first_name = "Bob"
    last_name = "Smith"
    yield(first_name, last_name)
  end
end

['a', 'b', 'c', 'd'].my_name {|i, x| puts "#{i} #{x}"}

但是当我将类名从“Array”更改为其他名称时,例如“Array1”,我收到以下错误:

`<main>': undefined method `my_name' for ["a", "b", "c", "d"]:Array                              (NoMethodError)

我不确定该错误是什么意思,但它破坏了我的代码。这是损坏的代码:

class Array1
  def my_name
    first_name = "Bob"
    last_name = "Smith"
    yield(first_name, last_name)
  end
end

['a', 'b', 'c', 'd'].my_name {|i, x| puts "#{i} #{x}"}

对于我的一生,我无法弄清楚出了什么问题。我真的只是想弄清楚如何在类中的方法上使用 yield 函数。我真的遇到了麻烦,如果有人可以帮助我,将不胜感激。谢谢!

【问题讨论】:

  • BTW - yield 不是函数,而是关键字(即与defend 的状态相同,与例如puts 的状态不同)。

标签: ruby syntax-error yield


【解决方案1】:

['a', 'b', 'c', 'd'] 是类 Array 的一个实例(不是 Array1 类)。为了能够调用类 Array1 中定义的方法,您应该首先创建该类的实例。

Array1.new.my_name {|i, x| puts "#{i} #{x}"}
# Bob Smith
#=> nil

【讨论】:

  • 子类化数组是一个坏主意。如果它只是为了添加一个方法而加倍。
  • 但我想这就是我感到困惑的地方。我将之前指定的两个类放在单独的文件中。他们不应该单独运行吗?如果我的 .rb 文件中甚至不存在 Array,为什么是 ['a', 'b', 'c', 'd'] 和 Array 的实例?
  • @John123 Array 是一个核心类。您始终可以访问它及其方法。
  • 为什么会有人在这里继承Array?调用方法my_name 需要什么特定的Array 行为?
  • @SergioTulentsev 我从来没有说过继承一个数组是个好主意。 OP问重命名核心类有什么问题 - 我回答了。他问如何让它发挥作用——我展示了。你说得对,不需要对 Array 进行子类化。
【解决方案2】:

由于未知原因,您尝试在 Array 实例上调用新引入的方法。只要在它所属的地方调用它:

Array1.new.my_name { |i, x| puts "#{i} #{x}" }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2023-03-15
    • 2012-10-02
    • 2019-06-22
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多