博客地址 :《Ruby 元编程》读书笔记 (四)
相关文章:
《Ruby 元编程》读书笔记 (一) 《Ruby 元编程》读书笔记 (二) 《Ruby 元编程》读书笔记 (三) 《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 对象。
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)
使用 Lambda 方法创建的 Proc 与其它方式创建的 Proc 是有一些差别的,用 lambda 方法创建的 Proc 称为 lambda,而用其他方式创建的则称为 proc。通过 Proc#lambda?可以检测 Proc 是不是 lambda。
二者之间主要的差异有以下两点:
def double(callable_object)
p = Proc.new { return 10 }
result = p.call
return result * 2 # 不可达的代码
end
double #=> 10
p = Proc.new { |a, b| [a,b] }
p.call(1,2,3) #=> [1, 2]
p.call(1) #=> [1, nil]
lambda 更直观,更像是一个方法,参数要求更加严格,return 也更像是方法定义中的 return,往往 Ruby 程序员会将 lambda 作为第一选择。(PS: 这部分还真需要考证一下!)
-待续-
=============== 最后贴一下自己的公众账号
可以十日不将军,不可一日不拱卒,日拱一卒 (rigongyizu365)