我可以在 Ruby 方法中访问隐式 Proc 中定义的方法吗?

Can I access the methods defined in an implicit Proc in a Ruby method?

假设我有以下代码:

def my_test(&fn)
    #code goes here
end

my_test {
    def my_cool_fn(a, b)
        a + b
    end
}

问题: 有没有什么方法可以从 my_test 的主体中访问由块定义并传递给它的特定方法 fn?

这是我试过的方法。我受到 Struct 通常定义方式的启发:

Person = Struct.new(:name, :age) {
    def greet
        puts "Person #{name} says hello!"
    end
}
mike = Person.new("Mike", 37)
mike.greet

我知道可以通过以下方式使用它来实现类似于我想要的效果,但是非常不优雅。

def my_test(&fn)
    ex_struct = Struct.new(:dummy, &fn)
    instance = ex_struct.new
    puts "The result is: #{instance.my_cool_fn 3, 6}"
end

my_test {
    def my_cool_fn(a, b)
        a + b
    end
}

这将打印预期的 The result is: 9。然而,这似乎有点 hacky,我想知道是否有更“正确”的方法来实现这个结果。

(† 这个问题,就我的目的而言,纯属假设和娱乐;我没有试图解决更大的问题,只是想更多地了解这种语言。)

Ruby 是一种面向对象的语言。每个方法都需要在某些东西(某个对象)上定义。您需要选择要在何处定义该方法。

您可以在同一对象上定义它 my_test 当前定义 (main) 只需评估块。

def my_test(&fn)
  instance_eval(&fn)
end

my_test {
  def my_cool_fn(a, b)
    a + b
  end
}

my_cool_fn(1,2) #=> 3

或者您可以使用新的 class/module(例如 Struct)并像您一样在那里定义它。