gpt4 book ai didi

ruby - 要映射的函数的简写

转载 作者:数据小太阳 更新时间:2023-10-29 06:48:05 26 4
gpt4 key购买 nike

map 中,我可以使用方便的 &: 符号调用传入值的方法:

nums = (0..10).to_a
strs = nums.map(&:to_s)

是否有类似的东西可以调用将值作为第一个参数传入的函数?

nums = (0..10).to_a
nums.each(puts) # error!

最佳答案

免责声明:这篇文章纯粹是教育性的。 nums.each {|n| puts n} 真的是真正的项目中唯一合理的写法。

理解nums.map(&:to_s)

现有的简短格式非常简单。 & 在符号上调用 to_proc,符号上的 to_proc 是这样定义的。

class Symbol
def to_proc
Proc.new { |*args| args.shift.__send__(self, *args) }
end
end

由于此 proc 将开始像传递到 map 的常规 block 一样工作,因此本例中的 *args 实际上是我们正在迭代的每个元素。我们获取第一个 args(因为 * 将参数转换为数组),并将 self 发送给它,self 是实际的符号,例如作为 :to_s。剩余的参数被传入。所以这就像说 nums.map{ |*args| args.shift.__send__(:to_s, *args) .

更改它以启用 nums.each(&:puts)

我们可以很容易地重新实现 to_proc 来实现不同的行为。这是一个简单的例子。

class Symbol
def to_proc
Proc.new { |*args| __send__(self, *args) }
end
end

(1..10).each(&:print) # => 12345678910

这里不是将符号名称作为消息发送给元素,而是将符号作为当前上下文的方法调用,并将迭代的元素作为参数传递给它。

所以它更像是说 (1..10).each{|*args| __send__(:print, *args)}.

理解nums.each(&method(:puts))

也就是说,正如 nash 指出的那样,您可以调用 nums.each(&method(:puts))。那里发生的事情是,您使用 ruby​​ 的 method 方法获得了一个表示方法 puts 的对象。然后 & 调用方法对象上的 .to_proc,将它变成 proc,proc 本身开始扮演传递给 each 的 block 的角色(或 map )。传递给该 proc 的参数(您正在迭代的每个元素)然后成为该方法的参数。整洁。

实现xargs

为了避免覆盖标准行为,我们可以假设实现我们自己的 xargs 功能,就像在 shell 脚本中一样。 (不要在家里这样做,太聪明是不好的。)

class Symbol
def to_xargs
Proc.new{ |*args| __send__(self, *args) }
end
end

def xargs(sym)
sym.to_xargs
end

(1..10).each(&xargs(:print)) # prints 12345678910

关于ruby - 要映射的函数的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com