Menu
CoddyTech

定义类

本课属于 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
Dog

new 会创建对象,然后使用你传给 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)
challenge icon

挑战

简单

完成 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Ruby 在线编译器