Ruby의 메소드와 같은 해시 값에 액세스하는 방법

6373 단어 rubyrails
Ruby에서 개체의 메서드와 같은 해시 값에 액세스하려면 ActiveSupport::OrderedOptions 을 사용하십시오. 이 클래스는 Hash에서 상속되며 동적 접근자 메서드를 제공합니다.

일반적으로 해시를 사용하여 이 작업을 수행합니다.

person = {
    name: "Jason",
    company: "Basecamp"
}

person[:company] # 'Basecamp'

OrderedOptions 를 사용하면 다음과 같이 작성할 수 있습니다.

require "active_support/ordered_options"

person = ActiveSupport::OrderedOptions.new

# set the values
person.name = "Jason"
person.company = "Basecamp"

# access the values
person.name  # => 'Jason'
person.company # => 'Basecamp'


구현



배후에서 Rails는 Ruby의 메타프로그래밍을 사용하여 이 기능을 구현합니다. method_missing 메서드를 사용하여 메서드 호출을 처리합니다.

def method_missing(name, *args)
  name_string = +name.to_s
  if name_string.chomp!("=")
    self[name_string] = args.first   # set the value
  else
    bangs = name_string.chomp!("!")

    # get the value
    if bangs
      self[name_string].presence || raise(KeyError.new(":#{name_string} is blank"))
    else
      self[name_string]
    end
  end
end


전체 소스 코드here를 읽을 수 있습니다. Ruby의 메타프로그래밍에 대한 자세한 내용은 Metaprogramming Ruby 2 책의 내 노트를 참조하십시오.

실제 사용



Propshaft은 Rails용 자산 파이프라인 라이브러리입니다. 새 구성 개체를 만드는 대신 OrderedOptions를 사용하여 config.assets 설정을 정의합니다. Github에서 전체 소스를 읽을 수 있습니다.

class Railtie < ::Rails::Railtie
    config.assets = ActiveSupport::OrderedOptions.new

    config.assets.paths          = []
    config.assets.excluded_paths = []
    config.assets.version        = "1"
    config.assets.prefix         = "/assets"
end


이제 모든 해시를 OrderedOptions 인스턴스로 교체해야 한다는 의미는 아닙니다. 구성과 유사한 개체와 함께 사용하는 것이 더 좋으며 종종 더 읽기 쉬운 코드가 됩니다.

도움이 되길 바랍니다. 이 접근법에 대해 어떻게 생각하는지 알려주십시오.

좋은 웹페이지 즐겨찾기