好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ruby抽取url

ruby抽取url

http://www.cxyclub.cn/n/5652/

Ruby | Block和迭代器

2007-04-16 15:40:43

标签: Ruby ROR Rails 敏捷开发 yield

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://blackanger.blog.51cto.com/140924/23876

       Block 是只在花括号或 do … end 之间的一组代码,和方法调用相关联。为什么有两分解符号,书上有两种解释,一种是说因为使用习惯,有人用花括号,有人用 do…end 。另一种原因是因为用花括号比 do…end 绑定更紧。书上推荐:单行用花括号,多行用 do…end

看下面例子:

def fun

yield

end

fun { puts “hello baby” }

这会输出 hello baby

如果没有加 yield 的话,不会出错,返回 nil 。但是你用了 yield 没有给它接收块的时候就会出现异常( no block given LocalJumpError ))。看 javaeye 里有人讨论 yield 到底是什么东西,感觉有点可笑。搞那么复杂干什么。想知道 yield 怎么实现,看源码不就行了吗,我们现在知道 yield 能做什么就行了!只要出现了 yield ,必须给它块来喂它。就像个宠物似的。哈哈。

可以给 yield 提供参数,比如

def call_back

yield(“hello”,99)

end

call_back {|str,num| puts str,num}

do |str,num|

puts str,num

end

就会输出 :

Hello

99

竖线之间给出参数名来接受来自 yield 的参数。这个感觉很别扭呀!

我们可以修改一下:

def call_back(*a)

a.each do |arg|

puts arg

end

end

call_back([“hello”,99])

说明下 :each 方法中通过使用 yield 来实现迭代处理。

上面的 each 语句还可以写成:

a.each {|arg| puts arg}

a.each{|arg|;puts arg;}

这两句都可以,但是个人认为加分号不好,破坏了 Ruby 的纯净性。

块的出现使函数非常容易被封装和传递。事务处理可以被完美的封装到一个函数体内部:

拿文件处理来说,我们可以使用块来改写 open 方法。。。把异常处理封装进去。

还记得刚才说的那个 LoaclJumpError 异常吗?我们可以利用这种异常来产生不同的处理文件的方式。如下面伪代码:

Class File

….

def self.open(filename,openflag=”r”)

begin

f=File.new(filename,openflag)

yield f

f.close if f

rescue

return f

ensure

#f.close

# 一些消除操作等

end

这样我们就有了两种不同的 open 的使用方式:

1) 以块打开文件。这个是正常的方式:

File.open(‘test’) do |f|

Puts f.read

end|

2) 普通打开方式,我觉得这倒不正常了,处理方式不正常,不是用户不正常

f = File.open(“test”) # 后面并没有传入块,会引发异常

txt = f.read()

puts txt

f.close

不过在 java javascript 里也有这么应用的。但是 java js 里异常处理是必须的。没有像 Ruby 里这么使用的,不加块参数故意引发异常来用另一种形式来表现方法。比较灵活!

但是异常总归是异常!,有可能带来安全性问题!我们在异常处理的地方又加入了另一种处理方式。如果我们能在 block 传入之前就能判断 block 的值的话,这样避免异常的产生比较合理吧!

我们可以用 Proc 迭代器:

来改写下上面的文件处理伪代码:

class File

def self.open(filename,openflag=”r”,&block)

f = File.new(filename,openflag)

if block

block.call f

f.close if f

else

return f

end

end

end

还可以用不同的两种方式来表现方法。

上例中的&block是标准的写法(当然你也可以写成&black,hehe ),这样才会产生一个名为block的Proc对象,然后你可以用call来执行块了:)

打开 Ruby fxri 工具,输入 call 来查看帮助。找到 Proc#call ,会看到关于 call 方法的介绍(解析块的)。

prc.call(params,...) => obj

prc[params,...] => obj

例子:

a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}

a_proc.call(9, 1, 2, 3) #=> [9, 18, 27]

a_proc[9, 1, 2, 3] #=> [9, 18, 27]

a_proc = Proc.new {|a,b| a}

a_proc.call(1,2,3)

查看更多关于ruby抽取url的详细内容...

  阅读:39次

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网
[ SiteMap ]