Ruby 是一种面向表达式的语言:每一段有效的代码执行之后都要产生一个值。下面快速浏览一下 Ruby 中不同类型的值。 1.2.1 基本数据 如我们所料,Ruby 支持布尔型(Boolean)、数值型(number)和字符串(string),且它们都支持常规运算: >> (true && false) || true => true >> (3 + 3) * (14 / 2) => 42 >> 'hello' + ' world' => "hello world" >> 'hello world'.slice(6) => "w" 一个 Ruby 符号表示一个名字,是一个轻量级、不可变的值。作为字符串的简单化、非内存密集化(less memory-intensive)的替身,符号在 Ruby 中被广泛使用——通常是作为散列表中的键使用(参见 1.2.2 节)。符号字面量的开头会有一个冒号: >> :my_symbol => :my_symbol >> :my_symbol == :my_symbol => true >> :my_symbol == :another_symbol => false 特殊值 nil 用来表示不存在任何有用的值: >> 'hello world'.slice(11) => nil 1.2.2 数据结构 Ruby 的数组字面量是一串用逗号分隔的值外加方括号的形式: >> numbers = ['zero', 'one', 'two'] => ["zero", "one", "two"] >> numbers[1] => "one" >> numbers.push('three', 'four') => ["zero", "one", "two", "three", "four"] >> numbers => ["zero", "one", "two", "three", "four"] >> numbers.drop(2) => ["two", "three", "four"] 范围(range)表示最小值和最大值之间值的集合。范围的写法是在两个值之间加两个点: >> ages = 18..30 => 18..30 >> ages.entries => [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] >> ages.include?(25) => true >> ages.include?(33) => false 一个散列(hash)表示一个集合,其中每个值都与一个键相关联;一些编程语言把这种数据结构叫作“映射”(map)、“字典”(dictionary)或者“关联数组”(associative array)。一个散列字面量写成大括号里用逗号分隔的“键 => 值”对的列表: >> fruit = { 'a' => 'apple', 'b' => 'banana', 'c' => 'coconut' } => {"a"=>"apple", "b"=>"banana", "c"=>"coconut"} >> fruit['b'] => "banana" >> fruit['d'] = 'date' => "date" >> fruit => {"a"=>"apple", "b"=>"banana", "c"=>"coconut", "d"=>"date"} 散列经常将符号用作键,所以键作为符号时,Ruby 提供了另一种书写键值对的语法。这种写法比“键 => 值”的方式更为紧凑,而且看起来很像常用于 JavaScript 对象的 JSON 格式 : >> dimensions = { width: 1000, height: 2250, depth: 250 } => {:width=>1000, :height=>2250, :depth=>250} >> dimensions[:depth] => 250 1.2.3 proc 一个 proc 是一段未经求值的 Ruby 代码,根据需要进行传递和求值;其他语言把这种语言结构称为“匿名函数”或“lambda 函数”。proc 字面量有多种写法,其中最紧凑的一种是“-> 参数 { 函数体 }”语法: >> multiply = -> x, y { x * y } => #<Proc (lambda)> >> multiply.call(6, 9) => 54 >> multiply.call(2, 3) => 6 除了 .call 语法,还可以使用方括号调用 proc: >> multiply[3, 4] => 12