我们经常使用&符号来缩短块,如下所示:
some_array.group_by(&:foo)
Run Code Online (Sandbox Code Playgroud)
是否有类似的缩短表达式的方法{|x| x}?
some_array.group_by{|x| x}
Run Code Online (Sandbox Code Playgroud)
如果有一种方法Object#self可以返回self,那么我们就可以做到
some_array.group_by(&:self)
Run Code Online (Sandbox Code Playgroud)
但不幸的是,没有这样的方法.就字符数而言,它可能更长,但可读性提高.
Bor*_*cky 30
是的.#itself在Ruby 2.2.0中实现.
您可以在此处访问有关此功能的Ruby核心团队讨论.
作为一个有趣的类比,已经提出了该#ergo方法,该方法将接收器产生给定的块.
如果您尚未升级到Ruby 2.2.0,您可能希望向后移植#itself和/或定义#ergo如下:
class Object
def itself; self end
def ergo
fail ArgumentError, "Block expected!" unless block_given?
yield self
end
end
Run Code Online (Sandbox Code Playgroud)
然后:
some_array.group_by &:itself
Run Code Online (Sandbox Code Playgroud)
cha*_*eyc 17
嗯,据我所知,没有内置功能,但你可以制作一个可重复使用的身份块:
id = Proc.new {|x| x}
some_array.group_by(&id)
Run Code Online (Sandbox Code Playgroud)
然后,如果真的希望这是一个语言功能:
class Object
def it
Proc.new {|x| x}
end
end
Run Code Online (Sandbox Code Playgroud)
然后你就可以做到
some_array.group_by(&it)
Run Code Online (Sandbox Code Playgroud)
无论你喜欢什么地方.这可能会使您的保修失效.
Dav*_*son 13
是! 该方法Kernel#itself在Ruby 2.2.0中添加.此方法只返回调用它的对象,因此您可以编写:
some_array.group_by(&:itself)
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看此功能的广泛讨论: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)
Run Code Online (Sandbox Code Playgroud)
但是,猴子修补Ruby核心的一部分可能是危险的,如果你正在制作可重复使用的代码,我不会推荐它,比如宝石.相反,我建议只使用user2246674建议你自己的身份功能:
module MyLibrary
IDENT = Proc.new { |x| x }
array.group_by(&IDENT)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2617 次 |
| 最近记录: |