각 배열 항목을 매개변수로 사용하여 메서드를 호출하는 Ruby 단축키

5276 단어 ruby
Ruby 프로그래머라면 배열의 각 항목에 대해 메서드를 호출하는 단축키&:를 알고 있을 것입니다. 예를 들어, 이 코드 조각은 to_s:foo 에서 :bar 메서드를 호출합니다.

[:foo, :bar].each(&:to_s)


위의 코드는 다음과 유사합니다.

[:foo, :bar].each do |item|
  item.to_s
end


그러나 배열 항목에서 메서드를 호출하는 대신 메서드를 호출하고 배열 항목을 해당 메서드에 전달하려고 합니다. 그것에 대한 하나의 라이너가 있습니까?

[:foo, :bar].each do |item|
  puts(item)
end


Ruby에는 이를 정확하게 수행할 수 있는 해당 단축키&method가 있습니다.

[:foo, :bar].each(&method(:puts))


여기에서 두 가지 일이 진행되고 있습니다.

먼저 method(:puts)puts라는 메서드를 찾습니다. 설명서에 따라 self를 호출한 개체에서 인스턴스 변수 및 method 메서드에 액세스할 수 있습니다.

method(sym) -> method

Looks up the named method as a receiver in obj, returning a Method object (or raising NameError). The Method object acts as a closure in obj's object instance, so instance variables and the value of self remain available.



둘째, Method 메서드(와우, 너무 많은 메서드 중 하나입니다)에서 반환된 method 객체는 to_proc 메서드를 구현하므로 & 다음에 사용할 수 있습니다. 즉, 다음과 같습니다.

If foo is an object with a to_proc method, then you can pass it to a method as &foo, which will call foo.to_proc and use that as the method's block.



&method(:puts) # is equivalent to
{ |e| puts(e) }

&:name # is equivalent to
{ |e| e.name }

&method(:puts)라고 말하면 Method 개체를 찾아 .to_proc를 호출합니다.

array.each(&method(:foo))


는 다음과 같습니다.

array.each { |e| foo(e) }



그만한 가치가 있습니까?



이제 each 루프의 명시적 메서드 호출을 이 한 줄짜리로 대체한다는 의미인가요? 아마 아닐 겁니다.

경우에 따라 명시적 메서드 호출은 코드를 읽기 쉽고 이해하기 쉽게 유지하는 데 필요한 것입니다. 동료뿐만 아니라 미래의 당신을 위해서. 이 한 줄짜리를 사용하면 두뇌가 수행하는 작업을 번역하고 이해하는 데 추가적인 정신적 오버헤드가 추가되는데, 이는 많은 경우에 가치가 없습니다.

그러나 때때로 이 지름길은 의도한 바를 표현하는 데 정확히 필요한 것입니다. 그래서 제가 루비를 좋아합니다. 소프트웨어를 작성하기 위해 원하는 대로 선택하고 실행하고 말할 수 있는 자유입니다.

어쨌든 도움이 되길 바랍니다.

좋은 웹페이지 즐겨찾기