Похоже, что вы хотите использовать method_missing
и define_method
.
Если вы используете method_missing
, не забудьте:
- вызов
super
для необработанных дел.
- также реализует
respond_to?
метод
посмотрите на этот вопрос , плюс , и , .
Обновление:
Похоже, цель состоит в том, чтобы выполнять статическую проверку методов, как это делают Java или c ++. Это не очень важно в ruby: - (
Так как в рубине:
- Каждый экземпляр объекта имеет свой собственный класс. У данного объекта могут быть необходимые методы, смешанные во время выполнения. Так что просто потому, что
Foo
не имеет метода во время загрузки класса, бессмысленно.
- Фреймворки, такие как RoR, перехватывают method_missing и динамически создают методы, необходимые для методов запроса к базе данных, поэтому метод может существовать (или не существовать), когда это необходимо.
Что касается «класса под нагрузкой»: определение класса действительно выполняется. Попробуйте это:
class Foo
p "Hi"
end
Вы увидите «Привет» в первый и только первый раз, когда Foo используется. Вот как такие вещи, как изобретают , пытаются творить свою магию.
class User < ActiveRecord::Base
# **CALL 'devise' method**
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
# **CALL attr_accessible method**
attr_accessible :email, :password, :password_confirmation
end
Так может быть по частному соглашению разработчики добавили вызов метода check_class
в конец рассматриваемых классов?
Я понимаю намерение, но похоже, что я сражаюсь так, как работает рубин.
Как человек, в основном Java, я ценю разочарование. Позвольте мне угадать: повторные случаи, когда код был запущен в производство с отсутствующими методами? : -Р
Update2:
wrt onload
При запрете использования ruby класса класс постоянно получает новые методы. (Или экземпляр может получить новые методы, определенные только для этого экземпляра.) Поэтому проверка на несуществование метода является только проверкой моментального снимка, а не такой окончательной проверкой, которую статический язык вносит в таблицу. Это собственная проблема Рубина Остановка