是什么to_proc方法是什么意思?(What does to_proc method mean?)

2019-07-19 21:48发布

我学习轨和下这个线程 。 我坚持的to_proc方法。 我认为唯一的符号作为替代字符串(它们像琴弦,但更便宜的在内存方面)。 如果有别的我失踪了符号,那么请告诉我。 请简单的方式解释什么to_proc手段,它是干什么用的。

Answer 1:

有些方法需要一个块,并且这种模式经常出现的块:

{|x| x.foo}

人们会喜欢写在一个更简洁的方式。 为了做到这一点,一个符号,该方法Symbol#to_proc ,隐式类铸造,并&操作者组合使用。 如果你把&在前面Proc在参数位置的实例,将被解释为一个块。 如果你把其他的东西比Proc与实例& ,那么隐含的类铸件将试图将其转换为Proc使用实例to_proc对该对象的定义方法,如果有的话。 在的情况下Symbol实例, to_proc的工作过程是这样:

:foo.to_proc # => ->x{x.foo}

例如,假设您这样写:

bar(&:foo)

&操作者与组合:foo ,这不是一个Proc实例,因此隐式类转换应用于Symbol#to_proc到它,这给->x{x.foo}&现在适用于这一点,并解释为一个块,这给:

bar{|x| x.foo}


Answer 2:

解释最简单的方法是用一些例子。

(1..3).collect(&:to_s)  #=> ["1", "2", "3"]

是相同的:

(1..3).collect {|num| num.to_s}  #=> ["1", "2", "3"]

[1,2,3].collect(&:succ)  #=> [2, 3, 4]

是相同的:

[1,2,3].collect {|num| num.succ}  #=> [2, 3, 4]

to_proc返回一个Proc对象,它响应由符号给定的方法。 因此,在第三种情况下,在阵列[1,2,3]调用它的收集方法和。 SUCC是由类Array定义的方法。 所以这个参数是说收集每个元素的数组中,并返回其继任者,并从创建一个新的阵列导致[2,3,4]的手短方式。 符号:SUCC被转换到一个Proc对象,以便它调用Array的SUCC方法。



Answer 3:

对我来说,最明显的解释是看到一个简单的实现它。 下面是它可能看起来像如果我重新实现符号#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'


Answer 4:

对于任何人还是有点难倒,运行下面的代码可能会使事情更清晰一点:

class Symbol
  def to_proc
    proc do |obj|
      puts "Symbol proc: #{obj}.send(:#{self})"
      obj.send(self)
    end
  end
end

class Array
  def map(&block)
    copy = self.class.new
    self.each do |index|
      puts "Array.map:   copy << block.call(#{index})"
      copy << block.call(index)
    end
    copy
  end
end

remapped_array = [0, 1, 2].map &:to_s
puts "remapped array: #{remapped_array.inspect}"

这些都不是实际实现Symbol.to_procArray.map ,他们是我用来演示如何刚刚精简版本map &:to_s和类似电话的工作。



文章来源: What does to_proc method mean?