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(×_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(×_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] 编辑: 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} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |