是否有一个简短的方法来写`{| x | X}`?

saw*_*awa 25 ruby

我们经常使用&符号来缩短块,如下所示:

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)

  • 值得注意的是,方法``#self``已经实现了Ruby 2.2.0 (3认同)

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)