当前位置: 首页 > 知识库问答 >
问题:

NoMachodError:未定义的方法'meow?'用于#-ruby混合失败?

庞阳波
2023-03-14

我正在玩ruby混合的一些基础知识,由于某种原因无法从我的模块访问行为。

在Ruby Fiddle上运行它:

module Cats
  MEOW = "meow meow meow"

  def Cats.meow?
    return Cats::MEOW
  end
end

class Example
  include Cats

  def sample
    return "it's a sample"
  end
end

e = Example.new
puts e.sample
puts e.meow?

这会不断返回NoMachodError:未定义的方法'meow?'对于#

我从tutorialspoint对mixin应该如何工作的理解让我觉得我应该能够有效地调用e.meow ,并返回与调用猫相同的结果。喵

这是RubyFiddle中的代码。

难以置信的基本,但你知道我在哪里跌倒吗?

共有2个答案

戈念
2023-03-14

在Ruby中使用include和extend的一般规则是:

如果要将模块用作命名空间

module Outer
  module Inner
    def self.my_method
      "namespaced method!"
    end
  end
end

您可以像这样使用my_方法或外部::内部。my_方法。

如果您想将模块用作mixin:

# In some cases it makes sense to use names ending in -able, since it expreses
# what kind of messages you can send to an instance or class that mixes
# this module in.
# Like Devise's Recoverable module: https://github.com/plataformatec/devise/blob/f39c6fd92774cb66f96f546d8d5e8281542b4e78/lib/devise/models/recoverable.rb#L24

module Fooable
  def foo
    "#{self} has been foo'ed!"
  end
end

然后,您可以包含它(某个实例获得#foo):

class Something
  include Fooable # Now Something.new can receive the #foo message.
end

Something.new.foo
=> "#<Something:0x0055c2dc104650> has been foo'ed!"

或者您可以扩展它(某些东西本身获得#foo作为类消息):

class Something
  extend Fooable # Now Something can receive the #foo message.
end

Something.foo
=> "Something has been foo'ed!"
罗飞宇
2023-03-14

事实证明,我在定义猫时过于具体。喵 。如果您想将模块用作mixin,那么您需要更一般地定义方法,而不是根据其特定的模块命名空间。

因此

def Cats.meow?
  ...
end

应该是这样的

def meow?
  ...
end 

这允许您调用e.meow?,因为方法定义不再将其仅限于Cats命名空间。

哎哟。

 类似资料:
  • 我想用ruby制作一个康威的生活游戏版本。我创建了一个网格类,其中@play\u area作为实例变量。然而,当我运行代码时,@play\u area在经过两次求值后显示为nil(当在行中求值时,如果@play\u area[x\u mod][y\u mod].alive)。为什么会这样? 编辑 以下是初始化函数: 以下是发生错误的函数: 对@play_area中每个单元格的检查显示每个单元格都正

  • 超过3个小时,我试图解决相当容易的错误(第一眼): 但还是没有成功。 我有DB表products,其中包含列category\u id和manufacturer\u id。 协会: 试图获取一些数据: 我获取了所有行,其中在列

  • 我知道有很多类似的问题,但这些解决方案都不管用。我有一个关系数据库。具体来说,我有两个相互关联的表格:程序和讲师。 表之间的关系如下: 一个程序“has_many:讲师”和一个讲师“belongs_to:程序” 以下是表格模型的代码: 我还有一个非常简单的观点: 控制器为: 问题是RoR没有识别表之间的关系,导致行"@an.instructors.empty?失败,并出现以下错误:nil的未定义方

  • 我正在学习Ruby,我有一个无法理解的bug。我有一个方法,它接受一个字符串(行)数组,并删除所有行,直到包含模式的某一行。该方法如下所示: 这工作正常,生成的字符串(行)正确显示在我正在生成的网页上。 此外,我想删除该模式后面的所有非空行。我修改了方法如下: 令人惊讶的是(至少对我来说)这不起作用。在生成的网页上,我看到的不是内容,而是错误消息:Liquid error:nil类的未定义方法“[

  • 众所周知,在Ruby中,类方法会被继承: 然而,令我惊讶的是,它不适用于混合物: 我知道#extend方法可以做到这一点: 但我正在编写一个包含实例方法和类方法的mixin(或者更确切地说,我想编写): 现在我想做的是: 我想要A,B从公共模块继承实例和类方法。当然,这是行不通的。那么,难道没有一种秘密的方法可以让这个继承在单个模块上工作吗? 对我来说,把它分成两个不同的模块似乎很不优雅,一个是包

  • 问题内容: 我正在使用Flask- SQLAlchemy,并且试图在父模型中编写一种混合方法,该方法返回其具有的子代数,因此可以将其用于过滤,排序等。这是一些精简的代码我正在努力: 我在这里遇到两个问题。首先,我不知道“ child_count(cls)”到底要返回什么,它必须是一个SQL表达式…我认为应该像 但我不确定。我遇到的另一个问题是,我无法从parent.py导入Child类,因此无论如