$1.to_sym => args[0]
과 ($1.to_sym,*args,&block)
은 다음 코드에서 무엇을합니까?루비의 동적 메서드 정의
class Table
def method_missing(id,*args,&block)
return as($1.to_sym,*args,&block) if id.to_s =~ /^to_(.*)/
return rows_with($1.to_sym => args[0]) if id.to_s =~ /^rows_with_(.*)/
super
end
# ...
end
상황 :
하는 Ruport는 루비보고 라이브러리입니다. 당신은 테이블 형식의 데이터를 생성하기 위해하는 Ruport :: 데이터 :: 표 클래스를 사용하는 예를 들어, 다른 형식으로 텍스트로 변환 할 수 있습니다 :의 당신은 프랑스 와인을 선택한다고 가정 해 봅시다과로 변환
require 'ruport'
table = Ruport::Data::Table.new :column_names => ["country" , "wine" ], :data => [["France" , "Bordeaux" ], ["Italy" , "Chianti" ], ["France" , "Chablis" ]]
puts table.to_text
⇒
+--------------------+
| country | wine |
+--------------------+
| France | Bordeaux |
| Italy | Chianti |
| France | Chablis |
+--------------------+
쉼표로 구분 값 :
found = table.rows_with_country("France")
found.each do |row|
puts row.to_csv
end
⇒
France, Bordeaux
France, Chablis
방금 수행 한 작업은 Ruport :: Data :: Table에서 rows_with_country()라는 메서드를 호출하는 것입니다. 그러나이 수업의 저자는 당신이 country라는 이름의 칼럼을 갖게 될 것을 어떻게 알 수 있습니까? 사실, 저자는 그것을 몰랐다. Ruport 내부를 보면, rows_with_country()와 to_csv()가 고스트 메소드라는 것을 볼 수 있습니다. Ruport :: Data :: Table 클래스는 위에 정의 된대로 다소 있습니다. argu- , 표준으로 열 이름을 취합니다 (국가),
호출 rows_with_country하는()는 전통적인 보이는 방법, rows_with에 호출된다. 또한 to_csv()에 대한 호출은 as (: csv)에 대한 호출이됩니다. 메서드 이 두 접두사 중 하나로 시작하지 않으면 Ruport는 NoMethodError를 throw하는 커널 # method_missing()에 을 반환합니다. (즉, 슈퍼 키워드가 무엇인지입니다.)
짧은 답변 : 첫 번째 일치 그룹을 가져 와서 기호 (이 경우 'rows_with_'또는 'to_'후행 값)로 변환하고 메서드 매개 변수로 전달하거나 해시 키로 사용합니다 첫 번째 인수는 method_missing입니다. –