需要明确的是,我认识到
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 的主题;我碰巧想为高尔夫做这件事,但能够将顶级函数转换为一流函数在高尔夫以外的某些情况下,传递它们的物体很有用)
eval
是 Kernel
中的一种方法,就像 Ruby 中的大多数其他东西一样,它们是“伪装成函数的方法”,因此您可以使用 Object#method
来获取对它的引用。然后使用 &
将 Method
转换为 Proc
:
$*.map(&method(:eval))
所以
method(:eval)
是对 eval
的“直接引用”。但您仍然需要致电 #to_proc
才能获得 #map
满意的东西。
由于
method
的长度,也许不太适合高尔夫,但我想不出其他的了。