Ruby是真正的面向对象语言,你所操作的一切东西都是对象,它们返回的操作结果也是对象。
在Ruby里,实例由类的构造函数创建。标准的构造函数是new。
song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
# and so on
虽然这些实例由同一个类创建,但它们各自有着唯一的特征。
首先,它们有唯一的对象标识(简单理解为对象ID)。
其次,你能定义实例变量,并且变量的值在每个实例中是唯一的。
这些实例变量保存着对象的引用。例如,每首歌可能会有一个实例变量保存歌曲的标题。
在类里面,你可以定义实例方法。方法是一个功能块,它能被类内部或外部(取决于方法的访问约束)调用。
实例方法能够访问实例变量和获取对象的引用。
方法通过向对象发送消息来执行。信息包含方法名和方法所需的参数。
当一个对象收到消息时,它查找自己的类中相应的方法。如果找到,则调用这个方法,如果没找到。。。
这些方法的业务逻辑听起来比较复杂,但其实使用起来很自然。让我们先看一些方法的调用。
"gin joint".length -> 9
"Rick".index("c") -> 2
-1942.abs -> 1942
sam.play(song) -> "duh dum, da dum de dum ..."
这里Ruby和大部分语言的不同之处值得我们注意。在java中,要得到一个数字的绝对值需要调用另一个方法并把数字传进去。
你可能会这样写:
number = Math.abs(number) // Java code
在Ruby中,数字内置有转换成绝对值的能力。你只要发送消息abs给数字,它就会自动执行了。
number = number.abs
当学习一门新的语言时,许多人都不会喜欢阅读那些枯燥的语法,那么就让我们直接进入正题吧。
我们先从一个简单的Ruby程序开始,我们将写一个方法,它返回个人的问候语。然后我们多次调用这个方法。
def say_goodnight(name)
result = "Good night, " + name
return result
end
# Time for bed...
puts say_goodnight("JohnBoy")
puts say_goodnight("MaryEllen")
就像这个例子所显示的那样,Ruby的语法是很简洁的。当代码以行为结束时,后面不需要分号。
Ruby使用#号注释单行,代码的布局几乎由你来决定。
方法使用关键字def定义,紧跟着的是方法名(如say_goodnight)和括号之间的参数。
实际上,括号是可选的,只是我们都喜欢使用它们。
Ruby不需要使用花括号来限定方法体的边界。取而代之的是,使用关键字end表示方法体结束。
这行代码代码puts say_goodnight("JohnBoy") 包含两个方法的调用,一个是say_goodnight另一个是puts。
为什么第一个方法的参数需要包含在括号内而第二个方法不用呢?实际上它完全取决于个人爱好。
下面的代码是等效的。
puts say_goodnight("JohnBoy")
puts(say_goodnight("JohnBoy"))
这里演示了Ruby的一些string对象。你能通过多种途径来创建string对象,
但通常用得最多的可能是字符串:一连串使用单引号或双引号标记的字符。
这两种方式的不同之处在于Ruby对于string处理的构造上。
使用单引号时,Ruby处理的很少,除了一些字符串转换的异常外。
使用双引号是,Ruby所用的处理工作很多。首先,它查找并替换以反斜线开始的字符,
并把它们替换成一些二进制值。比较常用的是\n,它被替换为换行符。
puts "And good night,\nGrandma"
produces:
And good night,
Grandma
其次,Ruby会运行双引号里面插入的表达式。在字符串中,#{expression}会被替换为express的值,
我们可以使用这个来重写刚才的方法。
def say_goodnight(name)
result = "Good night, #{name.capitalize}"
return result
end
puts say_goodnight('uncle')
produces:
Good night, Uncle
简单地,当expression是全局,实例或类变量时,不需要使用花括号包围。
$greeting = "Hello" # $greeting is a global variable
@name = "Prudence" # @name is an instance variable
puts "#$greeting, #@name"
produces:
Hello, Prudence
最后,我们还可以进一步的简化这个方法。Ruby方法的返回值是最后的表达式计算的值,因此我们可以去掉result这个临时变量。
def say_goodnight(name)
"Good night, #{name}"
end
puts say_goodnight('Ma')
produces:
Good night, Ma
Ruby使用一种简便的用法用帮助我们区分一个名字:名字的第一个字符指示它的用途。
局部变量,方法参数和方法名都应用以小写字母或下划线开头。全局变量的前缀是美元符号($),
实例变量使用"at"符号(@)开始,类变量则以两个"at"变量(@)开始。最后,类名,模块名和常量都以大写字母开头。
为方便起见,方法名和实例变量的多个单词之间使用下划线连接,类名使用混合大小写(每个单词以大写字母开头)。