Могу ли я получить краткое изложение того, что делает модуль Ruby? - PullRequest
1 голос
/ 10 декабря 2010

Я знаю, что это вещь пространства имен ... может кто-нибудь дать мне пример кода ... я быстро разбираюсь с примером кода ... спасибо!

Ответы [ 2 ]

5 голосов
/ 10 декабря 2010

Модуль в ruby ​​можно использовать для 3-х возможных вещей

1. Пространства имен

Это довольно просто.

module Foo
  class Bar
  end
end

f = Foo::Bar.new

2. Сборник функций

Иногда у вас будут некоторые функции, которые не вписываются ни в один класс. В чем-то вроде java, вы бы просто поместили их как набор статических методов в класс. В ruby ​​вы бы поместили их в модуль, поскольку наличие их в классе подразумевает, что класс предназначен для создания экземпляра

module FooHelper
  def self.bar
    puts 'hi'
  end
end
FooHelper.bar # => hi

3. Примеси

Это труднее всего понять из всех 3. По сути, это ответ Ruby на множественное наследование в C или интерфейсы в Java.

Иногда у вас есть логика, которая принадлежит нескольким классам, но в то же время не подходит как родительский класс. Mixin описывает "смешивание" методов модулей в классе. На самом деле это намного больше, но на очень высоком уровне это будет выглядеть так:

module CanFoo
  def foo
    puts 'bar'
  end
end

class Baz
  include CanFoo
end

class Bar
  include CanFoo
end

baz.new.foo # => bar
bar.new.foo # => bar

Миксины - довольно сложная тема, и вам потребуется некоторое время, чтобы понять, когда вы будете использовать один из них над суперклассом. IMO - это одна из самых крутых возможностей ruby, которая решает проблему множественного наследования с гораздо большей элегантностью, чем любой другой язык OO, на который я смотрел.

1 голос
/ 10 декабря 2010

Модуль - это набор констант, классов и функций внутри пространства имен. Вот пример:

module Payments
  CARD_TYPES = ["visa", "mastercard"]

  class CreditCard
    attr_accessor :number
    attr_accessor :type
  end

  extend self
  def process_payment
   ...
  end
end

Теперь у меня есть модуль платежей. Я могу вызвать Payments :: CARD_TYPES, чтобы получить массив; Payments :: CreditCard.new для создания объекта и Payments :: process_payment для вызова функции.

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