免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6830 | 回复: 10

ruby扫盲之迭代器 [复制链接]

论坛徽章:
0
发表于 2010-11-19 12:26 |显示全部楼层
本帖最后由 zuerrong 于 2010-12-06 11:31 编辑

在别的语言里,可能大家都习惯了for、while循环。
但是ruby里有自己特有的循环处理方式,叫做迭代器,它是目标方法。
这个方法接受一个block作为参数。
在ruby里,block的写法可以是 {|c| ...} 也可以是 do |c| ... end。
怎么写取决于各人的习惯。|c|里的表示接受参数。
一般如果一行就采用{}写法,多行就采用do end写法。如:
  1. arr = [1,2,3,4]
  2. arr.each {|c| puts c}
  3. arr.each do |c|
  4.     puts "going with " + c.to_s
  5. end
复制代码
从1循环到10,可以这么写:

  1. for i in 1..10 do
  2.    puts i
  3. end
复制代码
但是ruby更倾向于使用迭代器方法:
  1. (1..10).each do |i| puts i end
复制代码
上述当然还有upto这个方法:
  1. 1.upto(10) do |i| puts i end  
复制代码
其他的迭代器方法还包括:

打印文件里每一行:
  1. File.new("a.txt").each_line do |s|
  2.    puts s
  3. end
复制代码
列举目录里每一个文件:
  1. Dir.foreach("/tmp") do |d| puts d end
复制代码
访问数组的每个元素:
  1. arr = [3,2,1,4,0]
  2. arr.each do |e| puts e end
复制代码
访问数组的下标:
  1. arr.each_index do |i| puts i end
复制代码
访问串的每一个字符:
  1. s="hello"
  2. s.each_byte do |w| puts w.chr end
复制代码
访问哈希的每一对键值:

  1. x={"a"=>1,"b"=>2,"c"=>3}                  
  2. x.each do |k,v| puts "#{k} #{v}" end
复制代码
遍历哈希的每一个键:
  1. x.each_key do |k| puts k end   
复制代码
遍历哈希的每一个值:
  1. x.each_value do |v| puts v end   
复制代码
等等。
当然自己写一个迭代器方法也一点不难,例如,模拟数组的each方法,写一个myeach。
  1. x = [3,2,4,0,1]

  2. class Array
  3.    def myeach
  4.        for i in self do
  5.           yield i
  6.        end
  7.    end
  8. end

  9. x.myeach {|s| puts s }
复制代码

论坛徽章:
0
发表于 2010-12-06 11:35 |显示全部楼层
有人问为什么迭代器里,有的写法是{|c| ...},有的写法是do |c| ... end
其实它们都是block的有效表达,之前没写清楚,重新编辑帖子加上了。

论坛徽章:
0
发表于 2010-12-06 12:26 |显示全部楼层
Block中,我比较喜欢用do ... end。

论坛徽章:
0
发表于 2011-02-22 18:16 |显示全部楼层
恩,同感,只要是一行,基本是{},但是,两行以上就是do ... end, 习惯了。
就好比是总是喜欢用for i in XX 一样,呵呵,习惯不好改啊。

论坛徽章:
0
发表于 2011-02-22 18:38 |显示全部楼层
老是想不明白,yield怎么就实现了迭代?

class Array

   def myeach

       for i in self do

          yield i

       end

   end

end

其中的,yield i ,是 什么意思? 把i 迭代?

论坛徽章:
0
发表于 2011-02-22 18:48 |显示全部楼层
不知道这么解释对不对:

yield 和 block是成对使用的。

class Array
def myeach
       for i in self do
          yield i
       end
   end
end

x.myeach{|i|puts i}

其中{}扩住的,是block,也就是yield 要迭代的部分,也就是要重复执行的内容。

不知道这么解释对不对?LZ,还请指教,呵呵。

论坛徽章:
0
发表于 2011-02-22 18:49 |显示全部楼层
yield i 中的i 就是传递给block的,要重复执行的参数。

论坛徽章:
0
发表于 2011-10-09 16:56 |显示全部楼层
回复 6# ziyiu123


    关于这个问题,我也搞不明白,请 2gua (瓜瓜)  给解释一下吧。谢谢

论坛徽章:
0
发表于 2011-10-09 16:57 |显示全部楼层
回复 3# 2gua


    瓜瓜 解释一下 其中的,yield i ,是 什么意思? 把i 迭代?
谢谢

论坛徽章:
0
发表于 2011-10-12 09:07 |显示全部楼层
回复  2gua


    瓜瓜 解释一下 其中的,yield i ,是 什么意思? 把i 迭代?
谢谢
i_love_ruby 发表于 2011-10-09 16:57



    i是yield的参数,这个参数值传递给代码块{|s| puts s }中的s。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP