Model.all.map(&:title) 에서 &:title이 무슨 뜻인가요?


Rails에서 Model이 있고, Model.all.map(&:title)하면 무슨뜻인가요?

Ruby array에서 map을 [1, 2, 3].map { |n| n * n } #=> [1, 4, 9]이렇게 써 본 적은 있는데요.

  • 2016년 03월 21일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

조회수 299


2 답변


좋아요
9
싫어요
채택취소하기

Model.all.map(&:title)Model.all.map{ |o| o.title }과 동일하게 동작합니다.

ruby에서 파라미터에 &가 있으면 객체가 Proc이기를 기대하는데 만약 객체가 Proc이 아니면 객체의 to_proc메소드를 호출하여 Proc으로 변환합니다. 여기서는 :title이 Symbol 객체이므로 :title.to_proc을 호출하여 Proc으로 변환되는데 Symbol#to_proc은 Symbol명에 해당하는 메소드를 호출하게 해줍니다. 그래서 Model.all.map{ |o| o.title }와 동일한 동작을 하는 것이구요.

참고로 Symbol#to_proc은 Ruby On Rails의 ActiveSupport에 처음 등장했는데 Ruby 1.8.7에 정식으로 포함되었습니다. 내부 구현은 아래와 같습니다.

class Symbol
  # Turns the symbol into a simple proc, which is especially useful for enumerations. Examples:
  #
  #   # The same as people.collect { |p| p.name }
  #   people.collect(&:name)
  #
  #   # The same as people.select { |p| p.manager? }.collect { |p| p.salary }
  #   people.select(&:manager?).collect(&:salary)
  def to_proc
    Proc.new { |obj, *args| obj.send(self, *args) }
  end
end
  • 2016년 03월 21일에 작성됨
    Polyglot Programmer

  • 자주 쓰면서도 이렇게 자세하게는 몰랐는데, 참 좋습니다. `Model.all.map(&:title.to_proc)` 과 같은 형태로도 동작을 하네요.    이원섭wonsup Lee   2016.3.25 17:41     

찾아보니, 다음 표현은

Model.all.map(&:title)

다음의 약식(줄임) 표현이라고 합니다.

Model.all.map { |m| m.title }

결과적으로 title이라는 속성만 모아서 배열로 만들어질것 같네요.

간단한 테스트 예제

class TEST
  attr_reader :title
  attr_reader :number
  def initialize(title,number)
    @title = title
    @number = number
  end
end
m1 = TEST.new("A",1)
m2 = TEST.new("B",2)
m3 = TEST.new("C",3)

model = [m1,m2,m3]

print model.map(&:title)  #=> ["A","B","C"]
  • 2016년 06월 01일에 수정됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.
  • 2016년 03월 21일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close