加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 使用自定义方法的符号#to_proc

发布时间:2020-12-17 03:24:18 所属栏目:百科 来源:网络整理
导读:我喜欢在 Ruby中如何使用Symbol#to_proc将方法作为块传递: [1.0,2.0,3.0].map(:to_i)#= [1,2,3] 我也可以定义自己的lambda,times_two,并将它作为块传递: times_two = -(x) {x * 2}[1,3].map(times_two)#= [2,4,6] 虽然我似乎无法通过times_two作为符号: [
我喜欢在 Ruby中如何使用Symbol#to_proc将方法作为块传递:

[1.0,2.0,3.0].map(&:to_i)
#=> [1,2,3]

我也可以定义自己的lambda,times_two,并将它作为块传递:

times_two = ->(x) {x * 2}

[1,3].map(&times_two)
#=> [2,4,6]

虽然我似乎无法通过times_two作为符号:

[1,3].map(&:times_two)
#=> ArgumentError: wrong number of arguments (0 for 1)

但是,当我尝试使用方法执行相同操作时,我收到错误:

def times_three(x)
  x * 3
end

[1,3].map(&times_three)
#=> ArgumentError: wrong number of arguments (0 for 1)

[1,3].map(&:times_three)
#=> ArgumentError: wrong number of arguments (0 for 1)

我猜我不能这样做因为times_three是一种方法,而不是Proc.

那么如何定义自定义方法,以便它们可以像上面第一个示例中的to_i一样以Symbol#to_proc方式使用?

例如,我该怎么做?

[1,3].map(&:times_three)
#=> [3,6,9]

编辑:
我观看了下面发布的视频,显然你可以使用方法方法接近Symbol#to_proc:

def times_three(x)
  x * 3
end

t_three = method(:times_three)
[1,3].map(&t_three)
#=> [3,9]

但是,它不是符号#to_proc:

[1,3].map(&:t_three)
#=> NoMethodError: undefined method `t_three' for 1:FixNum

解决方法

class Integer
  def times_three
    return self * 3
  end
end

现在,因为times_three现在是Integer类的一个方法,你可以做符号来处理…

[1,3].map(&:times_three)

如果要访问不属于对象类但作用于对象的方法,则需要将该对象作为参数传递给方法…

def times_three(x)
  x * 3
end

[1,3].map{|i| times_three(i) }

proc的符号需要将对象用作接收器.

[1,3].map(&:some_action)

相当于

[1,3].map{|i| i.some_action}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读