2.6. 核心语言——对象,类,方法-1
为了建立有意义的程序,我们需要一些抽象的单元。在 Ruby 里面,这些单元就是对象和方法,所有的值都是对象。所有与值的交互都是通过调用一个对象的方法来发生的。对象是从类创建的,类是通过 class 关键字来定义的,类使用 def 来定义他们的实例方法。
类、方法的定义
这里是一个类,它有一个不接收参数的方法。
class Robot
def talk
"beep boop"
end
end
方法名的结尾符号的约定
方法的名称能够以 ?
结尾——通常是用于返回布尔值的方法,也能够以一个 !
结尾。按约定,当方法改变接收对象时就使用这个!
,没有 !
就不改变。比如 bot = “robot”,bot.gsub(“o”, “i”) 返回一个新的字符串 “ribit”,但 bot 本身并不会改变,然而 bot.gsub!(“o”, “i”) 会改变 bot 本身。
bot = "robot"
bot.gsub("o", "i") # => "ribit"
puts bot # => "robot"
bot.gsub!("o", "i") # => "ribit"
puts bot # => "ribit"
创建对象、调用方法
对象是通过调用类的 new 方法,从而实例化类来创建的。调用对象上的方法是在对象后面跟上.
和方法名来完成的。方法的返回值就是它方法体里面执行的最后一个表达式的值。除非方法里面包含了一个明确的 return 指令。
class Robot
def talk
"beep boop"
end
end
bot = Robot.new
puts bot.talk # => "beep boop"
&.
VS .
如果对象没有实现或对应所请求的方法, .
操作符就会引起一个错误。因此有一个 safe navigation 操作符 &.
,它的功能与 .
类似,但如果其左边的值为 nil
就会默默地返回 nil
,而不是引发一个错误,因为 nil
没有所请求的方法。
class Robot
def talk
"beep boop"
end
end
bot = Robot.new
puts bot&.talk # "beep boop"
bot = nil
puts bot&.talk # nil
bot = Robot.new
puts bot.talk # "beep boop"
bot = nil
puts bot.talk # NoMethodError (undefined method `name' for nil:NilClass)
&.
在可能没有赋值的可选值上调用方法是很有用的,bot&.talk
等价于这个三元表达式:
bot == nil ? nil : bot.talk