2017-12-01 10 views
1

나는 많은 방법의 결과를 출력하고 싶은 객체가 있습니다. 나는 메소드 이름의 배열을 가지고 그들을 통해 반복 할 :루비 메서드 이름 배열을 통해 반복

img = Magick::Image::read('/Users/rich/Projects/imagemagick/orig/IMG_4677.jpg')[0] 
atts = "background_color base_columns base_filename base_rows bias black_point_compensation".split(' ') 

atts.each do |i| 
    puts img.i # problem evaluating i 
end 

내가 시도 문자열 보간과 eval을하지만 난 그것이 메소드 호출의 실현을 얻을 수 없습니다.

개체에 메서드 이름으로 배열을 적용 할 수있는 방법이 있습니까?

+0

더 적절한 구문 '(BACKGROUND_COLOR의 base_columns가 base_rows 바이어스 black_point_compensation을 base_filename) w %'또는 것'% I (BACKGROUND_COLOR의 base_columns가 base_rows 바이어스 black_point_compensation을 base_filename)'. '% w()'는 공백으로 구분 된 목록을 의미하며'String' 기반의'Array' (기본적으로'split ('') '와 동일합니다)로 변환합니다. '% i()'는 동일하지만 아이템이 적절한'Symbol' 명명 규칙을 따르는 경우'Symbol' 기반의'Array'로 변환됩니다. – engineersmnky

+0

.split ('')을 실행했을 때 문제가있었습니다. 그래 너가 옳아. –

+1

'% i'은 아마도 문자열이 메서드 조회를 위해 내부적으로 심볼로 변환되기 때문에 아마도 더 낫습니다. 약간 더 효율적일 수 있습니다. – Max

답변

3

public_send를 사용하여 시도 :

atts = "upcase downcase".split 

atts.each do |i| 
    puts 'hEllO'.public_send(i) 
end 

#HELLO 
#hello 
+0

Perfect. 정말 고맙습니다. –

+1

좋은 답변입니다. '# public_send'는'# send'보다 우연히 private 메소드를 호출 할 수 없다는 점에서 큰 이점이 있습니다. 그렇지 않으면 아주 좋은 이유가없는 한 기본값이되어야합니다. – geoffharcourt