Menu
CoddyTech

Modüller ve include

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 57.

Modül, adlandırılmış bir metot grubudur. Nesneler oluşturamaz, ancak bir sınıf onu include edebilir ve böylece her örnek, sınıf onları tanımlamış gibi modülün metotlarına sahip olur. Buna mixin denir:

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

Çıktı:

Hello, I am Ada

Bir modülün metotları, yukarıdaki name gibi, sınıfın sağladığı metotları çağırabilir. Bu nedenle, her sınıf modülün kullandığı özellikleri sunduğu sürece bir modül çok farklı sınıflara hizmet edebilir:

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

Çıktı:

Hello, I am R2
Hello, I am Paris

Bir sınıfın yalnızca bir üst sınıfı vardır, ancak istediği sayıda modül içerebilir. include?, bir sınıfın bir modülü içerip içermediğini sorar ve modül, Ruby'nin yöntemlerini aradığı yer olan ancestors içinde sınıftan hemen sonra görünür:

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)

Çıktı:

swimming, flying
true
[Duck, Flyer, Swimmer]

Modüller ayrıca, adların çakışmaması için ilgili sınıfları ve sabitleri ad alanı adı verilen tek bir ad altında gruplandırır. Shop::Item ve Game::Item farklı sınıflardır:

module Shop
  TAX = 0.2

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

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

Çıktı:

shop item, tax 0.2
0.2
challenge icon

Görev

Kolay

Modülleri ve sınıfları tamamla. Greetable#greet, nesnenin name değerini kullanarak Hello, I am Ada döndürür. Walkable#walk(steps), @steps içinde tutulan sayaca (ilk seferinde nil ile başlar) adımları ekler ve biriken toplamı, Ada walked 30 steps değerini döndürür. Person her iki modülü de içerir; Robot yalnızca Greetable modülünü içerir ve adı, bir seri numarasının önüne gelen R- değeridir.

Sağlanan kod, ilk satırdan (Ada 7) bir kişi ve bir robot oluşturur, ardından greet p, greet r veya (kişi için) walk 10 komutlarını çalıştırıp her sonucu yazdırır ve son olarak robot walks: false değerini yazdırır.

Kodunu greetable.rb, walkable.rb, person.rb ve robot.rb dosyalarına yaz. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

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

# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi