面向对象

Ruby是面向对象的语言

方法和消息的关系听起来可能有些复杂,但是实际上这样很自然。我们先来看看一些方法调用:

"gin joint".length #-> 9

"Rick".index("c") #->2

-1942.abs #-> 1942

上面的例子中,点(.)前面的是消息的接收者,点后面的是要调用的方法名。第一个例子中请求一个字符串长度,第二个是请求在一个不同的字符串中找到字母c的索引位置,第三个取得了一个数的绝对值。

注意,此处Ruby与其它语言表现出的明显不同,在Ruby中, 得到一个数的绝对值的功能在数字对象里是内建的,所有细节都在内部。你只简单地发送信息abs给一个number对象并让它做所有的工作。

number = number.abs

这种方式同样可应用于所的Ruby对象:在c语言中要写 strlen(name),在Ruby中,只要name.length 就行了。这也是为什么我们说Ruby是一个纯的oo语言。

Ruby基础

让我们从一个简单的程序开始。这里有一个方法,它返回一个string类型的值,简单的把一个字符串加到用户名后面。然后调用这个函数2次。

def say_goodnight(name)

  result = "Good night, " + name

  return result

end

# Time for bed...

puts say_goodnight("JohnBoy")

puts say_goodnight("MaryEllen")

Ruby注释以#字符开头,直到行尾。

Methods方法定义以关键字def开始,接着是方法名(这里是say_goodnight)和用两个小括号括起来的方法参数,Ruby不需要用{ }来界定由语句与定义混合的本体,只需要用关键字end来结束本体。第一行把字符串字面值”Good night,”与参数name连接起来,并把它赋给了局部变量result,第二行把结果返回给调用者。注意我们不需要声明变量result;当给它赋值的时候,系统会自动创建的。

最后结果像这样:

Good night, JohnBoy

Good night, MaryEllen

“puts say_goodnight("JohnBoy")”包括了两个方法调用,一个是say_goodnight,另一个调用puts,但是为什么puts调用没有用括号呢?这种情况,完全是个人喜好问题。下面的调用都是等价的:

puts say_goodnight("JohnBoy")

puts(say_goodnight("JohnBoy"))

然而,生活并不总是这样简单,优先规则可能会使它很难看清楚哪个参数是给哪个方法的,所以还是建议在方法后面加上括号,除非是非常简单的场合。

有很多种办法可以创建string对象,或许最普通的方式是使用字符串字面值:单引号或双引号标记的字符序列。在单引号情况下,Ruby不会解释转义字符以及内嵌表达式。在双引号情况下,Ruby能够解释转义字符以及内嵌表达式。

比如:

puts "And good night,\nGrandma"

#=>And good night,

Grandma

处理双引号括起来的字符串的时候如果做的第二件事情就是表达式处理(expression interpolation)。在字符串内,序列#{ expression }将被expression的值代替。我们可以使用它来重写我们前面的方法。

def say_goodnight(name)

result = "Good night, #{name}"

return result

end

puts say_goodnight('Pa')

#=>Good night, Pa

当Ruby构造这个string对象时,先检查name的当前值,然后用这个值替换到字符串里面去。#{...}结构内允许任意复杂的表达式。我们调用capitalize方法,它的定义对所有字符串可用,使参数首字母以大写字母的形式被输出。

def say_goodnight(name)

result = "Good night, #{name.capitalize}"

return result

end

puts say_goodnight('uncle')

#=>Good night, Uncle

有个捷径,当表达式是个简单的全局,实例,或类变量(我们马上就会谈到它)时,你不需要提供花括号。

$greeting = "Hello" # $greeting is a global variable

@name = "Prudence" # @name is an instance variable

puts "#$greeting, #@name"

#=>Hello, Prudence

由于Ruby方法返回的值就是最后的表达式计算出的值,所以我们完全可以去掉临时变量与return语句

def say_goodnight(name)

"Good night, #{name}"

end

puts say_goodnight('Ma')

#=>Good night, Ma

Ruby使用约定来帮助它区分名字的用途:名字的第一个字母指出这个名字被如何使用。局部变量,方法参数,与方法名字的开头字母应该是小写字母或下划线。以美元符号$做为全局变量的前缀,以”at”符号@做为实例变量前缀,以双”at”符号@@做为类变量前缀。最后,类名字,模块名字,和常量名字必须以一个大写字母开始

在开头字符之后,名字可以由任意的字母,数字,下划线(有个限制,实例变量@sign的后面不可以数字)组合而成。根据习惯,多个单词组成的实例变量名在两个单词之间要有下划线,而对于有多个单词的类名字,则各个单词的首字母必须大写。

数组和哈希表

ruby的数组和哈希表是被索引的集合,它们存放着对象的集合,并且用一个key来访问。对数组来说这个key是一个整数,而哈希则支持任何对象作为key。两者都可以按需要动态增长以持有新元素,访问数组元素的效率最高,但是哈希表则更灵活。所有数组和哈希表都可以持有不同类型的对象;你可以有持有一个整数,字符串,和浮点数的数组,就如一会我们看到的。

你可以使用一个数组字面值,即包括在方括号中的组值,来创建并初始化一个新数组。对给出的数组对象,你就可使用两个方括号之间提供的索引来访问个别元素。

# 有三个元素的数组

a = [ 1, 'cat', 3.14 ]

# 访问第一元素

a[0] ! 1

# 设置第三个元素

a[2] = nil

# 显示数组

a ! [1, "cat", nil]

你可能已经注意到了,我们在例子中使用了特殊值nul。在许多语言中,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的哈希表与数组类似。哈希字面值使用花括号而不是方括号。对于每个条目字面值必须提供两个对象。一个给key,另一个给value。

例如,你可能想要乐器与它们所属的种类之间的映射关系。你可以做一个这样的哈希表

inst_section = {

'cello' => 'string',

'clarinet' => 'woodwind',

'drum' => 'percussion',

'oboe' => 'woodwind',

'trumpet' => 'brass',

'violin' => 'string'

}

符号=>左边的是key,右边其相应的值value。哈希表内的key必须是唯一的—你不能有两个”drum”条目。哈希表内的key与value可以是任意的对象—你可以用数组,其它哈希表等等来表示一个哈希表内的value。

哈希表的索引同样可使用方括号表示法,就像数组一样。

inst_section['oboe'] ! "woodwind"

inst_section['cello'] ! "string"

inst_section['bassoon'] ! nil

像最后那个例子显示的,当被索引的key不存在时,哈希表缺省返回nil。通常这是很方便的,如当用于条件表达式时,nil的含意是false。有时你可能会想修改这个缺省值。例如,如果你使用哈希表来统计每个key发生的次数,如果能让缺省值为0那将是很方便的。这做起来很容易,只要在创建新的,空哈希表时指定一个缺省值就可以了。

histogram = Hash.new(0)

histogram['key1'] ! 0

histogram['key1'] = histogram['key1'] + 1

histogram['key1'] ! 1

 

Ruby语法:

http://web.njit.edu/all_topics/Prog_Lang_Docs/html/ruby/syntax.html#retry

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值