【问题标题】:Ruby define method to return proc which makes use of an argument [closed]Ruby定义方法以返回使用参数的proc [关闭]
【发布时间】:2018-07-13 13:45:06
【问题描述】:

在 Ruby 中,我想定义一个接受参数的方法,该方法返回一个包含使用该参数的方法的过程。类似于以下内容

def test(word)
  proc do
    def hello
      puts word
    end
  end
end

my_proc = test('hello')
my_proc.call.hello

运行此代码时,局部变量“word”未定义

为了提供更多上下文,我正在尝试使用association extensions,它允许您向关联提供一个方法块,以在关联上定义额外的辅助方法。我有一些方法我想在具有相似关联的几个相似的活动记录模型上使用,但它们在进行调用时只有某个符号不同(在has_many 关系上传递给through 的连接表的名称) .所以理想情况下,我正在考虑制作一个接受该符号的方法,然后可以将其用于关联扩展的实现。

【问题讨论】:

    标签: ruby-on-rails ruby proc


    【解决方案1】:

    你的例子有两个问题:

    1. 您不能像那样调用“充满方法的过程”——它将作为关联扩展工作,但该块被评估为模块主体,而不是 called。

    2. def 关键字重置局部变量范围。要在函数中获取值,您可以使用 define_method 来定义它(该块保留周围的范围),或者将值放在函数能够找到它的其他位置(例如,类变量)。


    def test(word)
      proc do
        define_method(:hello) do
          puts word
        end
      end
    end
    
    Class.new(&test("hello")).new.hello
    

    另外,如果您在多个关联上定义大致相同的方法,则将它们定义为类级别范围可能会更简单。

    【讨论】:

      【解决方案2】:

      这就像你的电话。

      def test(word)
        proc do
          define_method :hello do
            puts word
          end
        end
      end
      
      my_proc = test('hello world')
      my_proc.call.hello
      

      广告返回# => hello world

      编辑:拿起@engineersmnky 评论,之后您可以直接拨打hello

      您可以在这里找到更多信息:Is it possible to have Methods inside Methods?

      【讨论】:

      • OP 请注意,hello 现在也是一种可在“全局级别”访问的方法。例如。你可以直接打电话给hello 而没有proc 作为接收者
      • 那里的proc没有意义。
      • @engineersmnky,谢谢!我不知道这个。我编辑了帖子。
      • 这与@matthewd 的回答有何不同?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多