2011-02-03 2 views
3

Rails를 사용하면서 나는 이와 같은 메소드를 호출 할 수 있음을 알았습니다.Ruby에서 다른 행에 매개 변수를 사용하는 메소드 작성

lot = Lot.new do |u| 
    u.grade_id = grade.id 
    u.company_id = company.id 
    u.type_id = type.id 
    u.sale_id = sale.id 
    u.quantity = lot[6] 
    u.price = lot[3] 
    u.info = lot[4] 
    u.remark = lot[5] 
end 

다른 행에 매개 변수를 전달합니다.

많은 인수를 취하는 몇 가지 메소드를 작성해야하며 이와 같은 메소드를 호출 할 수 있다면 훨씬 더 좋을 것이라고 생각합니다. 누군가가 유사한 방식으로 인수를 허용하는 작성 메소드를 수행하는 방법을 보여줄 수 있습니까? 가이드/문서에 대한 링크가 도움이 될 것입니다. 이것이 Ruby에서 코드 블록이라고 부르는 것입니까?

+0

당신이 무엇을 요구하는지 확실치 않습니다. A * 이것이 내가 가지고있는 것입니다. * 필요한 코드 스 니펫이 도움이 될 것입니다. – Zabba

+0

안녕 Zabba. RoR에서'new' 메소드를 발견 했으므로 스니 j에서 볼 수 있듯이 매개 변수를 별도의 행으로 전달합니다. 통상은 methodname (param1, param2, param3 등)에 의해 메소드를 호출합니다. –

답변

3

위 예제는 인수를 전달하지 않습니다. 메소드를 호출하고 블럭을 사용하여 새로 생성 된 인스턴스를 생성합니다.

이 코드

lot = Lot.new do |u| 
    u.grade_id = grade.id 
    u.company_id = company.id 
end 

lot = Lot.new 
lot.grade_id = grade.id 
lot.company_id = company.id 

블록을 사용하지 않는 두 번째 예로서 기록 될 수있다.

개체가 초기화 할 때 블록을 받아들이게하려면 initialize 파일에 다음 코드 줄을 추가하십시오.

yield self if block_given? 

여기, 당신이 "코드 블록"일반적인 프로그래밍 용어는 다른 루비에서 "블록"(의 깊은 이해 혜택을 누릴 것이라고 생각하는 예를 깊이에서

class MyObject 
    def initialize 
    # ... 
    yield self if block_given? 
    end 
end 
+0

좋은 답변입니다. 첫 번째 코드가 후자로 쓰여질 수있는 유일한 이유는 '롯'의 구현에 의한 것이지만 일반적으로는 아닙니다. – Phrogz

0

메소드에 블록을 전달해야합니다.

def initialize(&block) 
    yield self 
end 
+1

블록을 인수로 여기에 잡는 것은 필요하지 않으며 또한 (아주 약간의) 성능 저하에 유의하십시오. – Phrogz

0

다이빙의 또는 "코드 블록"). 그 코드가 유효하지만

def add10(n) 
    puts "#{n} + 10 = #{n+10}" 
end 

def do_something_with_digits(method) 
    1.upto(9) do |i| 
    method(i) 
    end 
end 

do_something_with_digits(add10) 
#=> "1 + 10 = 11" 
#=> "2 + 10 = 12" 
... 
#=> "9 + 10 = 19" 

, 그것의 의도 전달하는 방법에 몇 가지 코드를 그 방법은 실행 가진 코드를-인 다음 (무효) 루비 코드가 실제로 일을 잠시

척 Ruby에서 다양한 방법으로 가능합니다. 그 중 하나는 "블록"입니다.

Ruby의 블록은 방법과 매우 흡사합니다 : 블록은 몇 가지 인수를 취하여 해당 코드를 실행할 수 있습니다. foo{ |x,y,z| ... } 또는 foo do |x,y,z| ... end이 표시 될 때마다 세 개의 매개 변수를 사용하여 ...을 실행하는 블록입니다. (당신은 심지어 upto 방법은 위의 블록을 전달되는 것을 볼 수 있습니다.)

을 블록은 루비 구문의 특별한 부분이기 때문에, 모든 방법은 블록을 통과 할 수있다. 메서드 이 블록을 사용하는지 여부는 메서드에 달려 있습니다. 방법은 위의 모욕을 발행 할 준비가되어 있지만, 방법은 블록을 호출하지도 만 좋은 메시지가 인쇄 된 블록을 전달

def say_hi(name) 
    puts "Hi, #{name}!" 
end 

say_hi("Mom") do 
    puts "YOU SUCK!" 
end 
#=> Hi, Mom! 

예를 들면 다음과 같습니다.여기에 우리가 방법에서 블록을 호출하는 방법은 다음과 같습니다

def say_hi(name) 
    puts "Hi, #{name}!" 
    if block_given? 
    yield(name) 
    end 
end 

say_hi("Mridang") do |str| 
    puts "Your name has #{str.length} letters." 
end 
#=> Hi, Mridang! 
#=> Your name has 7 letters. 

우리는 블록이 함께 여부 전달되었는지 여부를 확인할 수 block_given?를 사용합니다. 이 경우 우리는 논증을 다시 블록으로 전달했습니다. 블록으로 전달할 항목을 결정하는 것은 사용자의 방법에 달려 있습니다. 예를 들어 :

def say_hi(name) 
    puts "Hi, #{name}!" 
    yield(name, name.reverse) if block_given? 
end 

say_hi("Mridang"){ |str1, str2| puts "Is your name #{str1} or #{str2}?" } 
#=> Hi, Mridang! 
#=> Is your name Mridang or gnadirM? 

그냥 몇 가지 클래스를 그냥 블록에 생성 된 인스턴스를 전달하는 (지원하려는 좋은 일, 한) 대회입니다.

@ SimoneCarletti의 대답을 이해하는 데 도움이되기를 바랍니다. 그러면 앞으로 프로그래밍 할 때 블록을 사용하는 데 도움이 될 것입니다.

관련 문제