константа спасения руби отсутствует?

несколько месяцев назад я использовал некоторую рубиновую библиотеку (к сожалению, я не могу вспомнить, какую именно)

Я был удивлен, увидев, что он позволил мне инициализировать его экземпляр примерно так:

Lib::SOMETHING(args)

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

Не могли бы вы посоветовать?


person Vlad Khomich    schedule 20.08.2011    source источник


Ответы (1)


Теоретически никакой магии там нет, просто выглядит незнакомо:

class A
  def self.I_LOOK_LIKE_A_CONST(arg)
    puts arg
  end
end

A::I_LOOK_LIKE_A_CONST("Hi") # => "Hi"

Net::HTTP делает что-то подобное со своим классом Proxy, он допускает такие вызовы, как Net::HTTP::Proxy(...), он определяется аналогично:

def HTTP.Proxy(p_addr, p_port = nil, p_user = nil, p_pass = nil)

Изюминка заключается в том, что для методов класса вы можете взаимозаменяемо использовать :: или . для их вызова.

person emboss    schedule 20.08.2011
comment
удивительно :) как-то раньше в голову не пришло. Благодаря тонну! - person Vlad Khomich; 20.08.2011
comment
Я также обнаружил метод const_missing (работает как с классом, так и с модулем) — точная копия method_missing. Я действительно не думал, что такой метод может быть реальностью, когда я разместил вопрос :) - person Vlad Khomich; 20.08.2011
comment
Я полагаю, вы могли бы также использовать const_missing, если вам нужно что-то более динамичное :). Но в случае с Net::HTTP::Proxy в этом, видимо, не было необходимости. - person emboss; 20.08.2011