Menu
CoddyTech

module dan include

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 27 dari 57.

module adalah kumpulan method bernama. module tidak dapat membuat object, tetapi class dapat include module tersebut, lalu setiap instance memiliki method dari module seolah-olah class mendefinisikannya. Ini disebut mixin:

module Greetable
  def greet
    "Hello, I am #{name}"
  end
end

class Person
  include Greetable
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

puts Person.new("Ada").greet

Output:

Hello, I am Ada

method dalam module dapat memanggil method yang disediakan class, seperti name di atas. Jadi, satu module dapat digunakan oleh class yang sangat berbeda, selama setiap class menyediakan hal yang digunakan module tersebut:

module Greetable
  def greet
    "Hello, I am #{name}"
  end
end

class Robot
  include Greetable

  def name
    "R2"
  end
end

class City
  include Greetable

  def name
    "Paris"
  end
end

puts Robot.new.greet
puts City.new.greet

Output:

Hello, I am R2
Hello, I am Paris

Sebuah class hanya memiliki satu superclass, tetapi dapat menyertakan modul sebanyak apa pun. include? menanyakan apakah sebuah class menyertakan modul, dan modul tersebut muncul di ancestors, tepat setelah class. Di sinilah Ruby mencari method-nya:

module Swimmer
  def swim
    "swimming"
  end
end

module Flyer
  def fly
    "flying"
  end
end

class Duck
  include Swimmer
  include Flyer
end

d = Duck.new
puts "#{d.swim}, #{d.fly}"
puts Duck.include?(Flyer)
p Duck.ancestors.take(3)

Output:

swimming, flying
true
[Duck, Flyer, Swimmer]

Module juga mengelompokkan class dan konstanta yang saling berkaitan dengan satu nama, yaitu namespace, agar namanya tidak berbenturan. Shop::Item dan Game::Item adalah class yang berbeda:

module Shop
  TAX = 0.2

  class Item
    def label
      "shop item, tax #{TAX}"
    end
  end
end

puts Shop::Item.new.label
puts Shop::TAX

Output:

shop item, tax 0.2
0.2
challenge icon

Tantangan

Mudah

Lengkapi module dan class. Greetable#greet mengembalikan Hello, I am Ada, menggunakan name milik object. Walkable#walk(steps) menambahkan steps ke penghitung yang disimpan di @steps (pertama kali dimulai dari nil) dan mengembalikan Ada walked 30 steps, total berjalan. Person menyertakan kedua module; Robot hanya menyertakan Greetable dan namanya adalah R- diikuti nomor serial.

Code yang disediakan membuat person dan robot dari baris pertama (Ada 7), lalu menjalankan perintah greet p, greet r atau walk 10 (untuk person) dan mencetak setiap hasil, lalu robot walks: false.

Letakkan kodemu di greetable.rb, walkable.rb, person.rb, dan robot.rb. main.rb berisi code input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'greetable'
require_relative 'walkable'
require_relative 'person'
require_relative 'robot'

# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
  input << line.chomp
end
name, serial = input[0].split
person = Person.new(name)
robot = Robot.new(serial)
input.drop(1).each do |line|
  command, arg = line.split
  if command == "walk"
    puts person.walk(arg.to_i)
  else
    target = arg == "p" ? person : robot
    puts target.greet
  end
end
puts "robot walks: #{Robot.include?(Walkable)}"
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online