符号链接和to_proc

sbs*_*sbs 6 ruby symbols proc

众所周知,Rubyist &会调用to_proc一个符号,所以

[:a, :b, :c].map(&:to_s)
Run Code Online (Sandbox Code Playgroud)

相当于

[:a, :b, :c].map { |e| e.to_s } # => ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

假设我想立即调用另一个方法to_s,这两个实现将起作用:

[:a, :b, :c].map { |e| e.to_s.upcase }
[:a, :b, :c].map(&:to_s).map(&:upcase)
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有办法& Symbol#to_proc在一个参数中链接调用?就像是:

[:a, :b, :c].map(&:to_s:upcase)
Run Code Online (Sandbox Code Playgroud)

谢谢!

mu *_*ort 5

如果您只是在做:

%i[a b c].map { |e| e.to_s.upcase }
Run Code Online (Sandbox Code Playgroud)

然后只使用块并继续处理更重要的事情。如果您确实在进行一连串的Enumerable调用,并且发现这些块在视觉上太吵了:

%i[a b c].map { |e| e.to_s.upcase }.some_chain_of_enumerable_calls...
Run Code Online (Sandbox Code Playgroud)

那么您可以将逻辑转换为lambda来帮助清理外观:

to_s_upcase = lambda { |e| e.to_s.upcase }
%i[a b c].map(&to_s_upcase).some_chain_of_enumerable_calls...
Run Code Online (Sandbox Code Playgroud)

或将其放入方法中并说:

%i[a b c].map(&method(:to_s_upcase)).some_chain_of_enumerable_calls...
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都在给逻辑一点点名称(这几乎&:symbol就是您的全部工作),以使代码更易读和更易理解。在的特定情况下to_s.upcase,这一点都没有意义,但是当块变大时,这些方法非常有用。


saw*_*awa 5

您需要提前定义一些方法,但这将具有普遍性.你可以这样做:

class Symbol
  def * other
    ->x{x.send(self).send(other)}
  end
end

[:a, :b, :c].map(&:to_s * :upcase)
[:a, :b, :c].map(&:to_s * :capitalize)
...
Run Code Online (Sandbox Code Playgroud)

我选择了*作为功​​能组合的方法.

如果您认为可以使用第三个符号,则可以定义如下:

class Proc
  def * other
    ->x{call(x).send(other)}
  end
end
Run Code Online (Sandbox Code Playgroud)