ruby - 在 Ruby 中,如何获取对包含用于调用的参数的方法的引用?

标签 ruby binding methods first-class-functions

鉴于此代码:

a = {1=>2}
m = a.method(:[])

我知道我现在可以使用:

value = m.call(1)

它将返回 2。问题是,我需要更改什么才能直接调用该方法,如下所示:

m.call()

它会得到 1 作为参数发送吗?如果能够写出这样的东西那就太好了:

m = a.method(:[],1) # where the symbol is the method, and 1 will be the parameter it will be called with

问题是,我想延迟执行脚本的某些部分,直到创建一些对象,并且我想避免重写所有内容以使用 lambda。

最佳答案

基本上,您想要的是一种柯里化(Currying)函数的方法。

http://en.wikipedia.org/wiki/Curry_function

这可以通过多种不同的方式来完成,其中之一:

def curry(method, *params)
  lambda { send method, *params }
end

您可以将其添加到 Hash 的元类中,或者添加到您想要包含在某些对象中的模块等中。然后,调用它就成为您想要的用例:

irb(main):001:0> a = {1 => 2}
=> {1=>2}
... # add curry to Hash's metaclass
irb(main):011:0> m = a.curry :[], 1
=> #<Proc:0xb76e2154@(irb):8>
irb(main):012:0> m.call
=> 2

关于ruby - 在 Ruby 中,如何获取对包含用于调用的参数的方法的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1708265/

相关文章:

ruby-on-rails - Rails 3 事件管理员。如何为非管理员角色的用户禁用仪表板?

ruby-on-rails - 如何按散列值在 JSON 散列数组中进行搜索?

c# - 改进枚举到组合框的绑定(bind)(使用 MarkupExtension)

java - 你能得到继承的方法的子类吗?

ruby-on-rails - 使用 Carrierwave 调整条件图像大小

ruby-on-rails - Rails 5,每个页面都需要事件记录

xaml - WPF 通过构造函数设置 DataContext

用于自定义监听器的 Android 数据绑定(bind)库 lambda

java - 提取后方法调用不起作用

Java 重写私有(private)与公共(public)