Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:正在尝试object.send一个带参数的模块函数_Ruby - Fatal编程技术网

Ruby:正在尝试object.send一个带参数的模块函数

Ruby:正在尝试object.send一个带参数的模块函数,ruby,Ruby,我有一个模块,其中定义了一个函数: module Settings def find_by_name(name, start) puts "find_by_name: Found me!" end 在miniTest中,我试图以模拟在运行时动态定义/调用该函数的方式测试“发送”到此函数。下面是我在迷你测试中要做的 require 'settings' class TestFileUtilities < MiniTest::Unit::TestCase def test_dyn

我有一个模块,其中定义了一个函数:

module Settings
def find_by_name(name, start)
  puts "find_by_name: Found me!"
end
在miniTest中,我试图以模拟在运行时动态定义/调用该函数的方式测试“发送”到此函数。下面是我在迷你测试中要做的

require 'settings'

class TestFileUtilities < MiniTest::Unit::TestCase

  def test_dynamic_call_to_Settings
    foreign_function = 'Settings::find_by_name'
    send(foreign_function, 'name.txt', 'Users/MCP/Desktop/Projects/TestDir')
  end
需要“设置”
类TestFileUtilities
我所期望的是send()将调用“foreign_function”方法,将字符串转换为符号,然后将两个参数添加到调用中。我所希望的就是没有错误,并且一个puts放在我的控制台上,这样我就知道它在工作……然后我将开始定义“断言”。现在,虽然我得到:

NoMethodError: undefined method `Settings::find_by_name' for #<TestFileUtilities:0x007fdf59840310>
NoMethodError:for的未定义方法“Settings::find_by_name”#

这是我第一次玩弄Ruby动态调用方法的能力,当我没有使用scope resolution操作符并且在
TestFileUtilities
中包含设置时,我能够让它工作,但我宁愿使用scope,这样用户定义的函数就不会与my类(不仅与MiniTest冲突,而且与实际的FileUtilities类冲突)。任何想法/帮助都将不胜感激!对于任何在这里寻找信息的人来说,这就是我开始的原因

从您的问题中不清楚类蓝图与设置的关系。我假设Blueprints是设置的子类,或者您打算使用设置

我所期望的是send()将调用“foreign_function”方法,将字符串转换为符号,然后将两个参数添加到调用中

您需要对要发送()的对象(或类)调用send():


你的例子有几个问题

  • 您还没有做任何明显的事情使
    find_by_name
    成为
    Blueprints
    的类方法,因此即使跳过
    send
    部分,如果您试图调用
    Blueprints::find_by_name('name.txt',Users/MCP/Desktop/Projects/TestDir')
    要解决这个问题,您必须说
    Blueprints.extend(Settings)
    ,这将把设置模块混入Blueprints类,其实例方法将成为Blueprints的类方法

  • 方法名是一个符号,需要一个符号作为其第一个参数,如果它是字符串,则将其转换为符号。您正在传递字符串
    'Blueprints::find_by_name'
    ,这是一个非常奇怪的方法名称,而不是您定义的名称。我认为您打算在类或模块
    Blueprints
    上调用方法
    find\u by\u name
    。为此,您可以说
    foreign_function='find_by_name';Blueprints.send(外部函数'name.txt',Users/MCP/Desktop/Projects/TestDir')
    如果您也需要动态解析类/模块名称,您可以选择

  • 这就是我想你说的意思:

    module Settings
      def find_by_name(name, start)
        puts "find_by_name: Found me!"
      end
    end
    
    class Blueprints
      extend Settings
    end
    
    require 'settings'
    
    class TestFileUtilities < MiniTest::Unit::TestCase
    
      def test_dynamic_call_to_actual_Blueprints
        klass = 'Blueprints'
        func = 'find_by_name'
        Object.const_get(klass).send(func, 'name.txt', 'Users/MCP/Desktop/Projects/TestDir')
      end
    
    end
    
    模块设置
    def按名称查找(名称、开始)
    放上“按名称查找:找到我!”
    结束
    结束
    班级蓝图
    扩展设置
    结束
    需要“设置”
    类TestFileUtilities
    I在这个特定实例中,我在尝试包含其他模块中的函数时遇到了问题,而不是在任何类中。我正在
    require
    ing我试图发送到的模块,但是当我执行
    ModuleName::send(:function\u name)
    时,我收到一个错误,声明“该名称不存在任何方法”(或接近该错误的内容)。解决这个问题的方法是将我试图“发送”到的模块中的函数定义为“self.function\u name”

    然后在发送文件/模块/类中:

    require '../lib/something.rb'
    
        class MyClass
          def this_crazy_thing
            funct = 'my_function'
            Something::send(funct)
          end
        end
    
    现在,通过简单地将
    模块Something
    中的函数定义为
    self
    ,以上功能就可以工作了。根据我的理解,这与在Ruby中如何实例化对象有关。让我想到这里的是,不使用动态
    发送
    功能…如果我知道我要调用的模块中函数的名称,我可以使用以下方法调用它:

    ModuleName::function_name(params)
    
    因此,我期望类似于使用
    send
    的东西。我的猜测是,因为我试图发送到一个对象,所以函数需要绑定到我要发送到的对象,即模块,以便可以将其作为该对象的实例调用。很明显,我仍然对一切都是Ruby中的一个对象这一事实耿耿于怀。希望这至少能让某人走上正确的道路。如果有人能解释为什么会这样:

    module ModuleSomething
      def a_function
       puts "hi"
      end
    end
    
    require '../lib/modulesomething'
    class MyClass
      def this_thing
        ModuleSomething::a_function
      end
    end
    
    但不是:

    require 'ModuleSomething'
    class MyClass
      def this_string
        funct = 'a_function'
        ModuleSomething::send(funct)
      end
    end
    

    这可能有助于进一步澄清我的解决方案起作用的原因。当我发现更多,我会补充这一点。谢谢大家

    所以我意识到我在制定问题时做的复制/粘贴工作搞砸了。我试图做的是调用模块中定义的函数。那不是在课堂上。看来我试过的或你建议的都不管用。所做的工作是将该模块中的用户定义函数放在一个类中,实例化该类的一个实例…然后对其调用send()(send()到一个我不知道存在的方法,但如果用户完成了他的工作,它应该会…)规范工作了…我将测试更多。只是想说声谢谢,确保我没有错过什么。你看起来很困惑
    obj.send(:foo,args)
    obj.foo(args)
    完全相同
    send(str)
    相当于
    send(str.to_sym)
    如果您正在调用模块方法,那么
    obj
    应该是模块。如果您正在调用实例方法,
    module ModuleSomething
      def a_function
       puts "hi"
      end
    end
    
    require '../lib/modulesomething'
    class MyClass
      def this_thing
        ModuleSomething::a_function
      end
    end
    
    require 'ModuleSomething'
    class MyClass
      def this_string
        funct = 'a_function'
        ModuleSomething::send(funct)
      end
    end