zuerrong 发表于 2010-11-19 12:26

ruby扫盲之迭代器

本帖最后由 zuerrong 于 2010-12-06 11:31 编辑

在别的语言里,可能大家都习惯了for、while循环。
但是ruby里有自己特有的循环处理方式,叫做迭代器,它是目标方法。
这个方法接受一个block作为参数。
在ruby里,block的写法可以是 {|c| ...} 也可以是 do |c| ... end。
怎么写取决于各人的习惯。|c|里的表示接受参数。
一般如果一行就采用{}写法,多行就采用do end写法。如:arr =
arr.each {|c| puts c}
arr.each do |c|
    puts "going with " + c.to_s
end
从1循环到10,可以这么写:
for i in 1..10 do
   puts i
end但是ruby更倾向于使用迭代器方法: (1..10).each do |i| puts i end上述当然还有upto这个方法: 1.upto(10) do |i| puts i end其他的迭代器方法还包括:

打印文件里每一行: File.new("a.txt").each_line do |s|
   puts s
end列举目录里每一个文件: Dir.foreach("/tmp") do |d| puts d end访问数组的每个元素: arr =
arr.each do |e| puts e end访问数组的下标: arr.each_index do |i| puts i end 访问串的每一个字符: s="hello"
s.each_byte do |w| puts w.chr end访问哈希的每一对键值:
x={"a"=>1,"b"=>2,"c"=>3}                  
x.each do |k,v| puts "#{k} #{v}" end 遍历哈希的每一个键: x.each_key do |k| puts k end   遍历哈希的每一个值: x.each_value do |v| puts v end    等等。
当然自己写一个迭代器方法也一点不难,例如,模拟数组的each方法,写一个myeach。x =

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

x.myeach {|s| puts s }

zuerrong 发表于 2010-12-06 11:35

有人问为什么迭代器里,有的写法是{|c| ...},有的写法是do |c| ... end
其实它们都是block的有效表达,之前没写清楚,重新编辑帖子加上了。

2gua 发表于 2010-12-06 12:26

Block中,我比较喜欢用do ... end。

ziyiu123 发表于 2011-02-22 18:16

恩,同感,只要是一行,基本是{},但是,两行以上就是do ... end, 习惯了。
就好比是总是喜欢用for i in XX 一样,呵呵,习惯不好改啊。:emn23:

ziyiu123 发表于 2011-02-22 18:38

老是想不明白,yield怎么就实现了迭代?

class Array

   def myeach

       for i in self do

          yield i

       end

   end

end

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

ziyiu123 发表于 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,还请指教,呵呵。

ziyiu123 发表于 2011-02-22 18:49

yield i 中的i 就是传递给block的,要重复执行的参数。

i_love_ruby 发表于 2011-10-09 16:56

回复 6# ziyiu123


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

i_love_ruby 发表于 2011-10-09 16:57

回复 3# 2gua


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

2gua 发表于 2011-10-12 09:07

回复2gua


    瓜瓜 解释一下 其中的,yield i ,是 什么意思? 把i 迭代?
谢谢
i_love_ruby 发表于 2011-10-09 16:57 http://bbs.chinaunix.net/images/common/back.gif


    i是yield的参数,这个参数值传递给代码块{|s| puts s }中的s。
页: [1] 2
查看完整版本: ruby扫盲之迭代器