2013-08-15 3 views
16

다음 코드를 단순화하는 방법이 있습니까?Ruby 메서드를 블록으로 변환하는 방법은 무엇입니까?

파일 이름은 파일 이름 (문자열) 목록입니다 (예 : [ "에 foo.txt", "bar.c", "baz.yaml"]

filenames.map { |f| File.size(f) } 

는 "File.size을"설정으로 발동하거나 차단하는 방법이 있는가? 기존 개체의 메서드에 대해서는 &:method을 사용할 수 있습니다. 모듈 수준 방법과 비슷한 것이 있습니까? (AFAIK는 관용적 아니지만)

답변

22

당신은 Object#method(method_name)를 사용할 수 있습니다

filenames.map(&File.method(:size)) 
+0

예. 이것은 내가 줄 예정인 것입니다. 하지만 당신이 날 이길 .. 이것을 제시해 주셔서 감사합니다. * + 1 *. –

+0

흥미 롭군요, 나는 '&'의 바인딩 순서에 대해 잘못 생각했을 것입니다. – DGM

4
filesize = proc { |f| File.size(f) } 
filenames.map(&filesize) 
+0

일을. 내가 왜 이렇게 생각하지 않았어? 이제 새로운 리팩토링 트릭이 생겼습니다. –

+4

단순화되지는 않지만 추가 복잡성이 추가됩니다. –

+2

@ MartinC.Martin 사실, 그것을 단순화하지 않습니다. 하지만 그건 당신이 물어 본 것입니다. 이 대답은 표현을 매우 간단하게 proc로 변환합니다. 자신을 비난하십시오. 로건이 아니라 네 잘못이야. – sawa

4

STDLIB의 Pathname는 파일 및 디렉토리에 대한보다 객체 지향 접근 방식을 제공합니다. 리팩터링 할 수있는 방법이 있습니다 (예 : filelist). 대신 :

filenames = Dir.entries(".") 
filenames.map { |f| File.size(f) } 

다음을 사용 : 아주 멋진

require 'pathname' 
filenames = Pathname.new(".").entries 
filenames.map(&:size) 
+2

감사의 말로, 문제의 제목에 답하지 않더라도 실제 문제는 해결됩니다. –