繁体   English   中英

Ruby:如何从模块中调用类的实例方法?

Ruby: How to call an instance method of a Class from a Module?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在类上定义了一个实例方法:

class Foo
  def is_linux
    # some code...
    # returns true or false
  end
end

我想在一个模块中调用此方法:

class Foo
  module Dog
    is_linux? ? puts "Is Linux" : puts "Is Windows"
  end
end

这给了我以下错误:

NoMethodError: undefined method `is_linux?' for Foo::Foo:Module

我知道我可以写

class Foo
  module Dog
    Foo.new.is_linux? ? puts "Is Linux" : puts "Is Windows"
  end
end

但我想知道模块是否有办法访问当前实例?

2 个回复

没有这样的选项,因为子类型(如模块)没有与其父实例连接。 如果你需要这样的构造,你只能制作is_linux? 类方法。 如果没有这种可能性,那么你可能有错误的设计。

基本上你需要以某种方式“分享”你的实用方法。

我建议将它们放入mixin中:

module Mixin
  def is_linux?
    true
  end
end

class Foo
  include Mixin # adding methods at instance level
end

class Foo
  module Dog

    extend Mixin # adding methods at class level

    puts is_linux? ? "Is Linux" : "Is Windows"

  end
end

#=> Is Linux
2 ruby - 如何在模块中动态调用实例方法

我正在尝试动态调用实例方法。 我发现send , call , eval这样做。 有动态调用类方法的例子,但我还没有弄清楚如何让它适用于实例方法。 例如 实例方法名称可以列出: 但我无法弄清楚如何调用该方法: 如何通过方法名称调用实例方法,如Foo ? ...

2017-04-20 09:03:04 1 576   ruby
3 Ruby中的类与模块:如何管理许多实例方法?

我正在使用一个聊天机器人对话框管理器,其中对话框是许多对话框的集合(其中对话框是一组方法)。 第一种方法是拥有一个Dialog类,该类在模块中包含“封装”的方法: 我很困惑,我不太喜欢这种解决方案。 这样,我可能会有重复方法的副作用(在Ruby中,允许重复方法:();例如,在me ...

4 如何在Ruby中调用类的所有实例方法?

我目前正在努力将自己的小测试方法运行器脚本放在一起。 我需要某种方法来调用类中的所有方法。 当我调用run_tests方法时,我的程序陷入了无限循环。 是什么原因造成的,有什么解决方案? ...

7 Ruby中的模块实例方法和模块“常规”方法

我试图找出模块的实例方法和模块的“常规”方法之间的真正区别。 为此,我启动了一个irb并执行以下操作: 我注意到这两者之间的输出是不同的。 例如, Kernel.methods包括:readline方法,而Kernel.instance_methods不包括方法。 为什 ...

2017-03-30 06:13:30 2 65   ruby
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM