Подтвердить что ты не робот

Является ли модуль Ruby эквивалентным интерфейсу Java?

Как я понимаю, интерфейс Java предназначен для обеспечения исполнения проекта, выставляя методы для классов, реализующих интерфейс для заполнения. Это тоже идея с модулем Ruby? Я вижу это так же, как с интерфейсами в Java, вы не можете создать экземпляр модуля в Ruby.

4b9b3361

Ответ 1

Я думаю, что я бы приравнял модуль к чему-то более близкому к методу расширения в С#. Вы добавляете функциональность к существующему классу, который определен в другом месте. Точного аналога в С# или Java нет, но я определенно не думал бы об этом как о интерфейсе, потому что реализация получена, а также интерфейс.

Ответ 2

Короткий ответ - нет.

Здесь аргументация, интерфейс Java/С# определяет сигнатуры методов, которые реализующий класс будет предоставлять как минимум.

Дополнительно:

  • С рубиновыми модулями нет такого контракта из-за утиного ввода.
  • Модули - это всего лишь способ извлечь общую функциональность для легкого повторного использования. Ближайшее отношение - это методы расширения С#, но они не являются точным совпадением, поскольку они существуют в статическом контексте.
  • Модули могут добавлять состояние в существующий класс.
  • Модули могут иметь статические методы
  • Модули могут действовать как пространства имен

Пример:

module SimpleConversation
  class NamespacedExample
    def poke
      puts "ouch"
    end
  end

  attr_accessor :partner_name
  def converse
    partner_name ||= "Slowpoke"
    speak + "\n#{partner_name}: Yes they are"
  end

  def self.yay
    puts "yay"
  end
end

class Foo
  include SimpleConversation
  attr_accessor :name

  def speak
    name ||= "Speedy"
    "#{name}: tacos are yummy"
  end
end

x = Foo.new
x.name = "Joe"
x.partner_name = "Max"
puts x.speak
puts x.converse

y = SimpleConversation::NamespacedExample.new
y.poke

SimpleConversation.yay

Ответ 3

Нет. Модуль в рубине более похож на статический класс. Я не разработчик Java, но я предполагаю, что интерфейсы Java похожи на интерфейсы С#, т.е. Они определяют контракт, но не реализацию.

Я не должен этого делать, хотя у меня есть опыт работы в рубине, это в создании видеоигр (RGSS/2). Я уверен, что я не знаю многих вещей, о которых знал бы ветеран-рубиновый программист.

Ответ 4

Модуль в ruby ​​- это немного пространства/пространства имен, которое можно добавить к другим вещам. Они используются для двух различных, но связанных целей: объединение связки связанных вещей (константы, классы и т.д.), Которые принадлежат друг другу, а затем добавление их в другую область (например, множественное наследование).

Например, существуют модули, называемые такими, как Comparable и Enumerable, и т.д., которые инкапсулируют функциональность, которую вы ожидаете, если бы эти прилагательные применялись. Предоставляя базовое определение (метод, который сравнивает два экземпляра для Comparable и итератор для Enumerable), вы можете импортировать модуль и найти себя с полным интерфейсом.

С другой стороны, существуют такие модули, как Net, которые вы бы редко включали в класс, но которые предоставляют набор функциональных возможностей, таких как Net:: HTTP, Net:: FTP, Net:: SMTP и т.д.

В середине есть такие вещи, как Math и Process, которые могут использоваться так или иначе.

- MarkusQ

Ответ 5

С формальной точки зрения модули в дизайне Ruby шаблон называется "mixin". http://en.wikipedia.org/wiki/Mixin

Его можно сравнить с особенностями PHP. http://php.net/manual/en/language.oop5.traits.php

Такая архитектура полезна в языках, которые не допускают множественного наследования, например. Ruby, PHP.