是否有一个简短的方法来写`{| x | X}`?
我们经常使用符号来缩短块,如下所示:
some_array.group_by(&:foo)
是否有类似的方法来缩短像{|x| x}
这样的表达式 {|x| x}
?
some_array.group_by{|x| x}
如果有一个方法Object#self
返回self
,那么我们就可以做到
some_array.group_by(&:self)
但不幸的是,没有这样的方法。 就字符数而言,它可能更长,但可读性提高。
是的 #itself
在Ruby 2.2.0中实现。
您可以在此处访问有关此function的Ruby核心团队讨论。
作为一个有趣的类比, 已经提出了#ergo
方法,它将使接收器产生给定的块。
如果您还没有升级到Ruby 2.2.0,您可能希望按照以下方式#ergo
移植#itself
和/或定义#ergo
:
class Object def itself; self end def ergo fail ArgumentError, "Block expected!" unless block_given? yield self end end
然后:
some_array.group_by &:itself
嗯,就我所知,没有内置function,但你可以创建一个可重用的身份块:
id = Proc.new {|x| x} some_array.group_by(&id)
然后,如果真的希望这是一个语言function:
class Object def it Proc.new {|x| x} end end
然后你就可以做到
some_array.group_by(&it)
无论你喜欢什么地方。 这可能会使您的保修失效。
是! 方法Kernel#itself
是在Ruby 2.2.0中添加的。 此方法只返回调用它的对象,因此您可以编写:
some_array.group_by(&:itself)
您可以在此处查看此function的广泛讨论: https : //bugs.ruby-lang.org/issues/6373 。 该补丁由RafaelFrança在#53号消息中提交。 你可以通过查看object.c在官方的Ruby源代码中看到它。
如果您使用的是早于2.2.0的Ruby版本,则可以通过将此代码放在项目中的某个位置并确保它是必需的,轻松地将Kernel#itself
添加到项目中:
module Kernel def itself self end end if !Kernel.instance_methods.include?(:itself)
然而,猴子修补Ruby核心的一部分可能是危险的,如果你正在制作可重复使用的代码,我不会推荐它,比如gem。 相反,我建议只使用user2246674建议你自己的身份function:
module MyLibrary IDENT = Proc.new { |x| x } array.group_by(&IDENT) end