включить модуль в ruby - PullRequest
       6

включить модуль в ruby

1 голос
/ 26 декабря 2009

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

Я пробую свои силы в модулях в ruby.

Я создал папку Project

внутри папки Project, создан класс One

class Project::One

  include Project::Rest

end 

внутри папки Project, создан модуль Rest

module Project::Rest

 def display
   puts "in display"
 end

end

но когда я пытаюсь запустить программу (ruby one.rb), я получаю

Неинициализированная константа Project (NameError)

Пожалуйста, помогите мне

Ответы [ 3 ]

3 голосов
/ 26 декабря 2009

Проблема в том, что вы никогда не определяете константу Project. Вы должны определить это, прежде чем сможете его использовать. Пример:

# root.rb
module Project
end
require "project/test"

# project/test.rb
class Project::Test
end

После этого вы сможете запустить ruby root.rb. Другой подход заключается в том, чтобы указать модуль в пространстве имен.

# root.rb
require "project/test"

# project/test.rb
module Project
  class Test
  end
end

В этом примере вы также можете запустить ruby project/test.rb, поскольку в этом файле определен модуль Project.

И если у вас есть несколько файлов, определяющих модуль Project, это тоже не проблема. Он не будет переопределен, он всегда будет одним и тем же модулем.

Оба эти метода будут определять модуль Project. Однако простое использование Project::Test не определит модуль.

В качестве идентификатора у Rails есть автозагрузчик. Если вы работаете с приложением rails и используете определенную структуру папок, для вас будут определены промежуточные модули такого типа. Однако без Rails вы должны определить их самостоятельно.

1 голос
/ 26 декабря 2009

Если у вас есть код в нескольких файлах, вам нужно загрузить эти файлы, прежде чем вы сможете получить доступ к тому, что в них. Обычно это делается с помощью оператора require. Я думаю, что вы хотите сделать, должно выглядеть так:

# one.rb
require 'rest'
module Project
  class One
    include Rest
  end
end


# rest.rb
module Project
  module Rest
    def display
      puts "in display"
    end
  end
end
1 голос
/ 26 декабря 2009

Проблема в том, что вы не правильно вкладываете свои классы / модули. Вы должны объявить модуль с ключевым словом module, а не просто написав class Project::Class. Предполагая, что у вас есть эта структура:

Project/
    one.rb
    rest.rb

тогда ваши файлы должны выглядеть примерно так:

# one.rb
require 'rest'

module Project
  class One
    include Project::Rest
  end
end

# rest.rb
module Project
  module Rest
    def display
      puts 'in display'
    end
  end
end

Обратите внимание, как модули вложены в эти примеры.

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