Ruby代码块对象Proc详解与使用方法
时间:2026-08-17 | 作者:极客少年 | 阅读:0Proc对象
把代码块变成对象,在Ruby里就是Proc。
创建Proc有四种常见方式,先看例子:
# 法一
inc = Proc.new { | x | x + 1}
inc.call(2) #=> 3
# 法二
inc = lambda {| x | x + 1 }
inc.call(2) #=> 3
# 法三
inc = ->(x) { x + 1}
inc.call(2) #=> 3
# 法四
inc = proc {|x| x + 1 }
inc.call(2) #=> 3
Proc与代码块的转换
除了直接创建Proc,还可以通过 & 操作符,在代码块和Proc之间来回转换。
如果你想把一个代码块作为参数传给方法,就得在参数名前加 &。而且,这个参数必须放在所有参数的最后。
& 的含义是:这里有一个Proc对象,但我想把它当作代码块来用。
反过来,去掉 &,就又变回一个Proc对象。
def my_method(&the_proc)
the_proc
end
p = my_method {|name| "Hello, #{name} !"}
p.class #=> Proc
p.call("Bill") #=> "Hello,Bill"
def my_method(greeting)
"#{greeting}, #{yield}!"
end
my_proc = proc { "Bill" }
my_method("Hello", &my_proc)
一些需要注意的地方
在实际编码中,很多人习惯直接使用代码块,很少主动创建Proc对象。
Proc更多时候是在幕后工作。经常能看到这样的写法:
def f(...) ... yield ... end def f(..., &p) ... p.call ... end def f(..., &p) instance_eval &p ... end def f(..., &p) ... define_method m, &p ... end
新手常见报错写法
但新手容易写出下面这类会报错的代码:
def f(..., &p) instance_eval p end def f(..., p) instance_eval p.call end
还有这种写法:
def f(..., &p) instance_eval do p.call end end
或者:
def f(...) instance_eval do yield end end
甚至有人这样写过:
def f(...) instance_eval yield end
问题根源
问题根源在于:该挂代码块的时候,却把Proc对象当成普通参数传进去了。
或者,不明白 &p 本身就是代码块,可以直接交给方法使用。
这类错误很大程度上,是因为没有把block和Proc的本质区分清楚。
记住这句话
&p是代码块p是Proc对象
除非万不得已,不要显式创建Proc。
每当对两者的关系犯糊涂时,默念几遍就稳了。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 使用RVM切换Ruby与Rails版本的实现方法
- 时间:2026-08-18
-
- Ruby语言是什么及入门使用方法
- 时间:2026-08-18
-
- Ruby on Rails网站项目搭建入门指南
- 时间:2026-08-18
-
- Ruby插入排序算法实现与二路插入排序代码示例
- 时间:2026-08-18
-
- Ruby图片滤镜算法实现代码与核心原理
- 时间:2026-08-18
-
- Ruby中Hash哈希结构基本操作方法详解
- 时间:2026-08-18
-
- Ruby面向对象编程:类方法与类扩展详解
- 时间:2026-08-18
-
- Ruby正则表达式语法详解与常用示例代码
- 时间:2026-08-18
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
