to_proc方法是什么意思?

swa*_*esh 44 ruby syntax symbols block proc

我正在学习rails并遵循这个主题.我坚持使用这种to_proc方法.我认为符号只是字符串的替代品(它们就像字符串,但在内存方面更便宜).如果还有其他我想念的符号,那么请告诉我.请以简单的方式解释什么to_proc方法和用途.

saw*_*awa 99

有些方法采用块,这种模式经常出现在块中:

{|x| x.foo}
Run Code Online (Sandbox Code Playgroud)

人们希望以更简洁的方式写出来.为此,组合使用符号,方法Symbol#to_proc,隐式类转换和&运算符.如果在参数位置放置&一个Proc实例,那么它将被解释为一个块.如果你将一个Proc实例以外的东西组合起来&,那么隐式类转换将尝试Proc使用to_proc该对象上定义的方法将其转换为实例(如果有的话).在Symbol实例的情况下,to_proc以这种方式工作:

:foo.to_proc # => ->x{x.foo}
Run Code Online (Sandbox Code Playgroud)

例如,假设你这样写:

bar(&:foo)
Run Code Online (Sandbox Code Playgroud)

&运营商的联合:foo,这是不是一个Proc实例,因此隐式类型转换适用Symbol#to_proc于它,这给->x{x.foo}.在&现在适用于这一点,并解释为一个块,这给:

bar{|x| x.foo}
Run Code Online (Sandbox Code Playgroud)

  • @MuhammadUmer您可以调用对象上的方法,例如`1.to_s`和`1.send(:to_s)`。所以实际上 `(1..10).each(&:to_s)` 相当于 `(1..10).each { |x| x.send(:to_s) }`. 该符号作为参数传递给“send()”方法。看看这个[链接](http://stackoverflow.com/a/9932720/4812050)。 (2认同)

Dil*_*son 43

最简单的解释方法是举一些例子.

(1..3).collect(&:to_s)  #=> ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)

是相同的:

(1..3).collect {|num| num.to_s}  #=> ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)

[1,2,3].collect(&:succ)  #=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

是相同的:

[1,2,3].collect {|num| num.succ}  #=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

to_proc返回一个Proc对象,它按符号响应给定的方法.所以在第三种情况下,数组[1,2,3]调用它的collect方法和.succ是由类Array定义的方法.所以这个参数是一种简单的说法,收集数组中的每个元素并返回它的后继,并从中创建一个新的数组,产生[2,3,4].符号:succ正在转换为Proc对象,因此它调用了Array的succ方法.

  • @Dilon +1示例:) (4认同)

Kei*_*ett 8

对我来说,最清楚的解释是看到它的简单实现.这是我重新实现Symbol#to_proc时的样子:

class Symbol  # reopen Symbol class to reimplement to_proc method
  def to_proc
    ->(object) { object.send(self) }
  end
end

my_lambda = :to_s.to_proc

puts my_lambda.(1)  # prints '1'; .() does the same thing as .call()
puts my_lambda.(1).class  # prints 'String'

puts [4,5,6].map(&:to_s)  # prints "4\n5\n6\n"
puts [4,5,6].map(&:to_s).first.class  # prints 'String'
Run Code Online (Sandbox Code Playgroud)