将顶级函数作为可调用函数传递给映射

问题描述 投票:0回答:1

需要明确的是,我认识到

eval
是邪恶的,这不适用于生产代码。也就是说,我正在尝试弄清楚我是否可以出于打高尔夫球的目的缩短:

$*.map{eval _1}

更进一步,以大致相同的方式:

$*.map{|x|x.to_i}
# and
$*.map{_1.to_i}

可以缩短为:

$*.map(&:to_i)

Python 的一流函数使这一切变得简单;像这样的列表:

[eval(x)for x in sys.argv[1:]]

可以缩短为:

[*map(eval,sys.argv[1:])]

因为

eval
是一等函数,没有括号就不会被调用。但我已经尝试了一切我能想到的方法来抑制
eval
在被通过之前尝试运行,例如
$*.map(&eval)
$*.map(:eval)
及其变体,并且它永远不会起作用(因为它不带参数调用
eval
,或者传递不充当
eval
函数的内容)。

这可能无法打高尔夫球,但我很好奇是否有任何方法可以获取对 eval

direct
引用(而不是创建一些新的自定义
Proc
lambda
或发生类似情况)在内部调用它)可以作为参数传递?

(需要明确的是,这不是一个真正的代码高尔夫挑战,所以我相信它仍然是 StackOverflow 的主题;我碰巧想为高尔夫做这件事,但能够将顶级函数转换为一流函数在高尔夫以外的某些情况下,传递它们的物体很有用)

ruby eval first-class-functions
1个回答
0
投票

eval
Kernel
中的一种方法,就像 Ruby 中的大多数其他东西一样,它们是“伪装成函数的方法”,因此您可以使用
Object#method
来获取对它的引用。然后使用
&
Method
转换为
Proc
:

$*.map(&method(:eval))

所以

method(:eval)
是对
eval
的“直接引用”。但您仍然需要致电
#to_proc
才能获得
#map
满意的东西。

由于

method
的长度,也许不太适合高尔夫,但我想不出其他的了。

© www.soinside.com 2019 - 2024. All rights reserved.