Как украсить все подобные методы в Ruby? - PullRequest
0 голосов
/ 21 ноября 2018

Вот мой класс:

class Book
  def read
     # something
  end
end

И еще один:

class Magazine
  def read
     # something
  end
end

Теперь я хочу украсить оба метода read в этих двух классах.Я хочу, чтобы они оба напечатали «привет» прямо перед началом работы.Как я могу это сделать?Я подозреваю, что мне нужно использовать миксин, но не могу понять, как именно.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Может быть, вы хотите что-то как:

class ReaderDecorator
  def initialize(obj)
    @obj = obj
  end

  def read
    puts 'Hello'
    @obj.read
  end
end

ReaderDecorator.new(Book.new).read
ReaderDecorator.new(Magazine.new).read
0 голосов
/ 21 ноября 2018

Вы можете prepend модуль:

module Decorator
  def read
    puts "hello"
    super
  end
end

class Book
  prepend Decorator

  def read
    puts "bye"
  end
end

class Magazine
  prepend Decorator

  def read
    puts "cya"
  end
end

Book.new.read 
# "hello"
# "bye"

Magazine.new.read
# "hello"
# "cya"

Также есть более чистый способ сделать этот вид модификаций с помощью refinements:

class Book
  def read
    puts "bye"
  end
end

class Magazine
  def read
    puts "cya"
  end
end

module Decorator
  def read
    puts "hello"
    super
  end
end

module DecoratedBook
  refine Book do
    prepend Decorator
  end
end

module DecoratedMagazine
  refine Magazine do
    prepend Decorator
  end
end

using DecoratedBook
using DecoratedMagazine

Book.new.read 
# "hello"
# "bye"

Magazine.new.read
# "hello"
# "cya"

Примечание: этот кодможет не работать в irb.

Также вы можете сделать это прямо во время выполнения:

module Decorator
  def read
    puts "hello"
    super
  end
end

[Book, Magazine].each do |klass|
  klass.prepend Decorator
end

Book.new.read 
# "hello"
# "bye"

Magazine.new.read
# "hello"
# "cya"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...