Ruby gem не добавляет метод в глобальную область видимости, используя exte - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь написать Ruby Gem, который, когда require d, добавляет функцию в глобальную область видимости.

Я придерживался следующих идей: Как добавить метод кглобальная область действия в Ruby? , однако, это просто не работает!(в любом случае на Ruby 2.4.3)

Вот мой фактический исходный код , но ниже также суммируется то, что я сделал, а что не работает:

# example.rb
module Example
    def self.hello()
        puts "Hello"
    end
end
extend Example

Тогда

# app.rb
require 'example' # Having built as a gem
hello() #=> `<main>': undefined method `hello' for main:Object (NoMethodError)

Где я ошибся?

1 Ответ

0 голосов
/ 20 декабря 2018

Серхио решил это за меня, хотя я не совсем понимаю, как!

Хорошей практикой считалось инкапсулировать методы в модуле, чтобы пользователи гема могли использовать их напрямую (hello) или ограничены (Example::hello) как им угодно.

Удалив self., метод может быть доступен только напрямую.Включая self. это не работает вообще.Однако, выполнив:

module Example
    extend self
    def hello
        puts "Hello"
    end
end
extend Example

... он работает в обоих направлениях.

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