当前位置:  开发笔记 > 后端 > 正文

我可以在不包含Ruby模块的情况下调用实例方法吗?

如何解决《我可以在不包含Ruby模块的情况下调用实例方法吗?》经验,为你挑选了6个好方法。

我认为最简单的方法就是抛弃单个调用(不改变现有模块或创建新模块)如下:

Class.new.extend(UsefulThings).get_file

@AlbertCatalà根据我的测试和http://stackoverflow.com/a/23645285/54247匿名类是垃圾收集就像其他一切一样,所以它不应该浪费内存. (3认同)


dgtized.. 130

如果将模块上的方法转换为模块函数,则可以简单地将其从Mods中调用,就好像它已被声明为

module Mods
  def self.foo
     puts "Mods.foo(self)"
  end
end

下面的module_function方法将避免破坏任何包含所有Mod的类.

module Mods
  def foo
    puts "Mods.foo"
  end
end

class Includer
  include Mods
end

Includer.new.foo

Mods.module_eval do
  module_function(:foo)
  public :foo
end

Includer.new.foo # this would break without public :foo above

class Thing
  def bar
    Mods.foo
  end
end

Thing.new.bar  

但是,我很好奇为什么一组不相关的函数首先包含在同一个模块中?

编辑显示,如果public :foo被调用后仍然有效module_function :foo



1> dolzenko..:

我认为最简单的方法就是抛弃单个调用(不改变现有模块或创建新模块)如下:

Class.new.extend(UsefulThings).get_file


@AlbertCatalà根据我的测试和http://stackoverflow.com/a/23645285/54247匿名类是垃圾收集就像其他一切一样,所以它不应该浪费内存.

2> dgtized..:

如果将模块上的方法转换为模块函数,则可以简单地将其从Mods中调用,就好像它已被声明为

module Mods
  def self.foo
     puts "Mods.foo(self)"
  end
end

下面的module_function方法将避免破坏任何包含所有Mod的类.

module Mods
  def foo
    puts "Mods.foo"
  end
end

class Includer
  include Mods
end

Includer.new.foo

Mods.module_eval do
  module_function(:foo)
  public :foo
end

Includer.new.foo # this would break without public :foo above

class Thing
  def bar
    Mods.foo
  end
end

Thing.new.bar  

但是,我很好奇为什么一组不相关的函数首先包含在同一个模块中?

编辑显示,如果public :foo被调用后仍然有效module_function :foo



3> Dustin..:

如果您"拥有"该模块,另一种方法是使用它module_function.

module UsefulThings
  def a
    puts "aaay"
  end
  module_function :a

  def b
    puts "beee"
  end
end

def test
  UsefulThings.a
  UsefulThings.b # Fails!  Not a module method
end

test


对于您不拥有它的情况:UsefulThings.send:module_function,:b
module_function将方法转换为私有方法(无论如何它在我的IRB中),这会打破其他调用者:-(
猎户座 - 我不相信这是真的.根据http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_module.html#Module.module_function,module_function"为命名方法创建模块函数.可以使用模块作为接收器调用这些函数,并且也可以作为混合在模块中的类的实例方法.模块函数是原始的副本,因此可以独立更改.实例方法版本是私有的.如果没有参数使用,随后定义的方法成为模块功能."
你也可以把它定义为`def self.a; 把'aaay'; end`

4> Raimonds Sim..:

如果要在不将模块包含在另一个类中的情况下调用这些方法,则需要将它们定义为模块方法:

module UsefulThings
  def self.get_file; ...
  def self.delete_file; ...

  def self.format_text(x); ...
end

然后你可以打电话给他们

UsefulThings.format_text("xxx")

要么

UsefulThings::format_text("xxx")

但无论如何我建议你把相关的方法放在一个模块或一个类中.如果你有问题想要从模块中只包含一个方法,那么它听起来就像是一个糟糕的代码味道,将不相关的方法放在一起并不是很好的Ruby风格.



5> renier..:

要在不包含模块的情况下调用模块实例方法(并且不创建中间对象):

class UsefulWorker
  def do_work
    UsefulThings.instance_method(:format_text).bind(self).call("abc")
    ...
  end
end


很难看,但是可以用。你一定喜欢Ruby :)

6> Dustin..:

首先,我建议将模块分解为您需要的有用的东西.但是你总是可以为你的调用创建一个扩展它的类:

module UsefulThings
  def a
    puts "aaay"
  end
  def b
    puts "beee"
  end
end

def test
  ob = Class.new.send(:include, UsefulThings).new
  ob.a
end

test

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有