Ruby 《Ruby 元编程》读书笔记 (四)

lazybios · 2015年09月11日 · 最后由 lazybios 回复于 2016年06月26日 · 4499 次阅读

博客地址 :《Ruby 元编程》读书笔记 (四)

相关文章:

《Ruby 元编程》读书笔记 (一) 《Ruby 元编程》读书笔记 (二) 《Ruby 元编程》读书笔记 (三) 《Ruby 元编程》读书笔记 (五)

传神的头图↓↓↓

Ruby元编程

Proc 对象

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)

Proc 与 Lambda 对比

使用 Lambda 方法创建的 Proc 与其它方式创建的 Proc 是有一些差别的,用 lambda 方法创建的 Proc 称为 lambda,而用其他方式创建的则称为 proc。通过 Proc#lambda?可以检测 Proc 是不是 lambda。

二者之间主要的差异有以下两点:

  • Proc、Lambda 的 return 含义不同; lambda 中的 return 表示的仅仅是从 lambda 中返回。而 proc 中,return 的行为则不同,其并不是从 proc 中返回,而是从定义 proc 的作用域中返回。即相当与在你的业务代码处返回。

示例代码

def double(callable_object)
    p = Proc.new { return 10 }
    result = p.call   
    return result * 2 # 不可达的代码
end

double #=> 10
  • Proc、Lambda 的 return 参数检查方式不同;Proc 的参数检查要比 Lambda 参数检查要更宽松一些,如果传入 Proc 中的参数数量不匹配其不会发生报错,会自行进行一定的调整到期望参数的样子,但是对于 lambda 则不同,如果出现参数不匹配的情况,其往往会报 ArgumentError 异常,中断程序。

示例代码

p = Proc.new { |a, b|  [a,b] }
p.call(1,2,3) #=> [1, 2]
p.call(1) #=> [1, nil]

Proc 与 Lambda 之间的选择

lambda 更直观,更像是一个方法,参数要求更加严格,return 也更像是方法定义中的 return,往往 Ruby 程序员会将 lambda 作为第一选择。(PS: 这部分还真需要考证一下!)

-待续-

=============== 最后贴一下自己的公众账号

可以十日不将军,不可一日不拱卒,日拱一卒 (rigongyizu365)

继续追踪...

lazybios 《Ruby 元编程》读书笔记 (十六)[连载完结] 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (一) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (二) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (三) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (五) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (六) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (七) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (八) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (九) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十一) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十二) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十三) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十四) 提及了此话题。 06月26日 10:50
lazybios 《Ruby 元编程》读书笔记 (十五) 提及了此话题。 06月26日 10:50
需要 登录 后方可回复, 如果你还没有账号请 注册新账号