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"变量(@)开始。最后,类名,模块名和常量都以大写字母开头。

为方便起见,方法名和实例变量的多个单词之间使用下划线连接,类名使用混合大小写(每个单词以大写字母开头)。