липсва константа за спасяване на ruby?

преди няколко месеца използвах някаква ruby ​​библиотека (не мога да си спомня коя точно, за съжаление)

Бях изненадан да видя, че ми позволи да инициализирам неговия екземпляр с нещо подобно:

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