真的骄傲梦想家园
专业源于兴趣和努力

数组和哈希表

Ruby的数组和哈希表是索引集合。两都都是保存对象集合并能通过键来读取。数组的键是数字,但是哈希表则支持对象作为键。它们都是随着新元素的加入要增长。在访问元素方面,数组效率比较高,但哈希表更加的灵活。无论是数组还是哈希表,都能保存不同类型的对象;你可以使用一个数组保存数字,字符串和浮点数,就像你等会将会看到的那样。

你可以使用数组文本来创建和初始化一个新的数组——一个由中括号包围的元素集合。对于一个数组,你能通过使用中括号间的数字来获取每个元素,就如例子所演示的那样。要注意,Ruby的数组是从0开始的。

  a = [ 1, 'cat', 3.14 ] # array with three elements
  # access the first element
  a[0] -> 1
  # set the third element
  a[2] = nil
  # dump out the array
  a -> [1, "cat", nil]

你可能已经注意到,我们在例子中使用了一个特殊的值nil。在许多语言中,nil的概念(或者null)是"没有对象"。在Ruby中,不是这样子的;nil是一个对象,就和其它对象一样;它代表什么都没有。不管怎样,让我们回到数组和哈希表吧。

有时候,创建单词数组是件痛苦的事情,它包含了许多引号和逗号。幸运的,Ruby有一个快捷的方式:%w能使用我们只做我们想做的。

  a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
  a[0] -> "ant"
  a[3] -> "dog"
  # this is the same:
  a = %w{ ant bee cat dog elk }
  a[0] -> "ant"
  a[3] -> "dog"

Ruby的哈希表和数组很相似。哈希表使用花括号而不是中括号。哈希表需要为每个项提供两个对象:一个是键,另一个是它的值。

例如,你想为乐队表示音乐器材。你可以使用哈希表来实现它。

  inst_section = {
  'cello' => 'string',
  'clarinet' => 'woodwind',
  'drum' => 'percussion',
  'oboe' => 'woodwind',
  'trumpet' => 'brass',
  'violin' => 'string'
  }

在=>左边的是键,在右边的是它对应的值。键在每个具体的哈希表中是唯一的,你不能有两个"drum"项。键和值在哈希表中可以是任意的对象——你可以哈希数组,甚至其它的哈希表等等。

哈希表使用和数组一样的中括号索引。

  inst_section['oboe'] -> "woodwind"
  inst_section['cello'] -> "string"
  inst_section['bassoon'] -> nil

就如最后一个例子中所看到的,如果键不存在,哈希表默认是返回nil。通常,这样做很方便,在使用条件表达式中,nil的意思是false。有时候,你想要改变这个默认值。例如,你想计算哈希表中键的访问次数,如果默认值是0就比较方便了。当你创建一个新的空的哈希表时很容易指定一个默认值。

  histogram = Hash.new(0)
  histogram['key1'] -> 0
  histogram['key1'] = histogram['key1'] + 1
  histogram['key1'] -> 1

控制结构

Ruby拥有所有常用的控制结构,像if语句和while循环。Java,C,和Perl程序会因为语句体中缺少花括号而出错。替代的,Ruby使用关键字end来表示语句体的结束。

  if count > 10
    puts "Try again"
  elsif tries == 3
    puts "You lose"
  else
    puts "Enter a number"
  end

类似的,while语句也是使用end结束。

  while weight < 100 and num_pallets <= 30
    pallet = next_pallet()
    weight += pallet.weight
    num_pallets += 1
  end

Ruby中大部分的声明都有一个返回值,你可以使用它作为条件语句。例如,gets方法从标准输入流中返回下一行或者当到达文件末尾时返回nil。因为在条件语句中Ruby把nil看成是false,你可以使用下面的代码来处理文件的所有行。

  while line = gets
    puts line.downcase
  end

这里,这个声明设置变量line的值为下一行或nil,然后while检测这个变量,当它为nil时结束循环。

当if或while声明只有一行代码时,Ruby的代码修饰符是一个有用的简化。只需要在表达式后面写上简单的条件语句。例如,下面是一个简单的if代码愉。

  if radiation > 3000
    puts "Danger, Will Robinson"
  end

再一次这个代码,使用代码修饰符重写它。

  puts "Danger, Will Robinson" if radiation > 3000

while循环类似的代码如下:

  square = 2
  while square < 1000
    square = square*square
  end
变得更简洁
  square = 2
  square = square*square while square < 1000

这个代码修饰符和Perl程序看起来比较熟悉。

posted on 2008-11-28 21:40  真的骄傲  阅读(1756)  评论(3编辑  收藏  举报