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

Rails:我无法调用/ lib中的模块中的函数 - 我做错了什么?

如何解决《Rails:我无法调用/lib中的模块中的函数-我做错了什么?》经验,为你挑选了4个好方法。

我知道我做了一些愚蠢的事情或者没有做一些聪明的事情 - 我经常对两者都感到内疚.

这是一个让我痛苦的例子:

我有一个模块保存在/ lib中作为test_functions.rb,看起来像这样

module TestFunctions
  def abc
    puts 123
  end
end

进入ruby脚本/跑步者,我可以看到模块正在自动加载(良好的配置以及所有......)

>> TestFunctions.instance_methods
=> ["abc"]

所以这个方法是已知的,让我们试试吧

>> TestFunctions.abc
NoMethodError: undefined method `abc' for TestFunctions:Module from (irb):3

不.这个怎么样?

>> TestFunctions::abc
NoMethodError: undefined method `abc' for TestFunctions:Module from (irb):4

再试一次.

defined?(TestFunctions::abc) #=> nil, but
TestFunctions.method_defined? :abc #=> true

就像我在顶部说的那样,我知道我是愚蠢的,有人会让我失望吗?



1> Gareth..:

如果你想要Module-level函数,可以用以下任何方式定义它们:

module Foo
  def self.method_one
  end

  def Foo.method_two
  end

  class << self
    def method_three
    end
  end
end

所有这些方法将使方法可作为Foo.method_oneFoo::method_one

正如其他人所提到的,在实例方法Modules为你到哪儿去这地方有哪些方法included是Module



2> Mike Woodhou..:

我将尝试自己总结各种答案,因为每个人都有一些有价值的东西可以说,但没有一个真正得到我现在意识到的可能是最好的回答:

我问的是错误的问题,因为我做错了.

由于我无法解释的原因,我想在库中使用一组完全独立的函数,这些函数代表了我试图从我的课程中干掉的方法.这可以通过使用类似的东西来实现

module Foo
  def self.method_one
  end

  def Foo.method_two
  end

  class << self
    def method_three
    end
  end

  def method_four
  end

  module_function :method_four
end

我也include可以在我的模块中,在一个类中,在这种情况下,方法成为类的一部分或外部,在这种情况下,它们是在我正在运行的任何类中定义的(对象?内核?Irb,如果我是交互式的?可能不是一个好主意,然后)

问题是,没有充分的理由不在一开始就上课 - 我不知不觉地接受了一条思路,让我失去了一个很少使用和坦率的有点奇怪的分支线.可能是OO成为主流之前的回忆(我已经够老了,直到今天我已经花了很多年时间编写程序代码).

所以这些函数已经进入了一个类,它们看起来很开心,并且在必要时可以愉快地使用这样暴露的类方法.



3> Marcin Urban..:

您也可以像这样使用module_function:

module TestFunctions
  def abc
    puts 123
  end

  module_function :abc
end

TestFunctions.abc  # => 123

现在,您可以在类中包含TestFunction并从TestFunctions模块中调用"abc".



4> 小智..:

我搞砸了一会儿,学到了几件事.希望这会帮助其他人.我正在运行Rails 3.2.8.

我的模块(utilities.rb)看起来像这样,位于我的rails app的/ lib目录中:

module Utilities

  def compute_hello(input_string)
     return "Hello #{input_string}"
  end

end

我的测试(my_test.rb)看起来像这样,位于我的rails应用程序的/ test/unit目录中:

require "test_helper"
require "utilities"

class MyTest < ActiveSupport::TestCase
  include Utilities

  def test_compute_hello
    x = compute_hello(input_string="Miles")
    print x
    assert x=="Hello Miles", "Incorrect Response"
  end

end

以下是一些需要注意的事项:我的测试扩展了ActiveSupport :: TestCase.这很重要,因为ActiveSupport将/ lib添加到$ LOAD_PATH.(seehttp://stackoverflow.com/questions/1073076/rails-lib-modules-and)

其次,我需要"需要"我的模块文件,并且还"包含"模块.最后,重要的是要注意从模块中包含的内容基本上放在测试类中.所以...请注意,您包含的模块不以"test_"开头.否则,Rails将尝试将您的模块方法作为测试运行.

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