是否有一个简短的方法来写`{| 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