定义类
本课属于 Coddy Ruby 学习旅程的“面向对象编程”单元。第 2 课,共 57 课。
类描述一类对象:它们知道什么,以及能做什么。class Dog ... end用于声明类,而Dog.new会创建该类的一个对象,也就是一个实例。在类中用def定义的方法可以在每个实例上调用:
class Dog
def speak
"Woof"
end
end
rex = Dog.new
puts rex.speak
puts rex.class输出:
Woof
Dognew 会创建对象,然后使用你传给 new 的参数调用对象的 initialize 方法。initialize 会设置对象,通常会将参数存储在实例变量中,实例变量的名称以 @ 开头:
class Dog
def initialize(name)
@name = name
end
def speak
"#{@name} says Woof"
end
end
puts Dog.new("Rex").speak
puts Dog.new("Bella").speak输出:
Rex says Woof
Bella says Woof方法和任何 Ruby 方法一样接受参数,并返回最后一个表达式的值。每次调用 new 都会创建一个独立的对象:
class Calculator
def add(a, b)
a + b
end
def average(numbers)
numbers.sum.to_f / numbers.size
end
end
calc = Calculator.new
puts calc.add(2, 3)
puts calc.average([1, 2, 3, 6])输出:
5
3.0类名是使用 CamelCase 编写的常量(BankAccount);方法名和变量名使用 snake_case(deposit_money)。new 会根据 initialize 检查参数,因此缺少参数会引发 ArgumentError:
class Point
def initialize(x, y)
@x = x
@y = y
end
end
begin
Point.new(1)
rescue ArgumentError => e
puts e.message
end输出:
wrong number of arguments (given 1, expected 2)挑战
简单完成 Formatter 类。它的方法 title(text) 返回每个单词首字母大写后的文本(the hobbit 会得到 The Hobbit),slug(text) 返回所有单词转为小写并用 - 连接后的文本(the-hobbit),initials(text) 返回每个单词首字母大写后的结果(TH)。
提供的代码会创建一个 Formatter,并针对每一行输入,在单独的行上打印这三个结果。
你的代码写在 formatter.rb 中。main.rb 包含提供的输入/输出代码,不能修改。
亲手试试
require_relative 'formatter'
# 提供的输入和输出代码:保持原样
input = []
while (line = gets)
input << line.chomp
end
formatter = Formatter.new
input.each do |line|
puts formatter.title(line)
puts formatter.slug(line)
puts formatter.initials(line)
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Ruby 在线编译器