키워드 인수를 언제 사용해야 하는지에 대한 의견을 묻는 이메일을 받았습니다.
모든 사람이 혜택을 받을 수 있도록 답변을 Ruby 메서드 인수에 대한 전체 기사로 확장해야 한다고 생각했습니다. !
Ruby는 메소드 인수와 관련하여 매우 유연합니다.
모든 것을 갖추고 있습니다 :
표준 필수 인수에서 선택적 인수 및 키워드(명명된) 인수까지.
이 문서에서는 차이점에 대해 배우게 됩니다 이러한 모든 인수 유형과 상황에 따라 사용할 수 있습니다.
올바른 종류의 인수를 사용하면 코드를 더 쉽게 읽고 작업할 수 있습니다.
의심스러운 경우 표준 인수 사용
필수 인수는 기본적으로 얻는 것입니다.
예시 :
def write(file, data, mode) end write("cats.txt", "cats are cool!", "w")
필요한 인수의 정확한 수를 전달하지 않으면 다음과 같은 친숙한 오류 메시지가 표시됩니다.
write("shopping_list.txt", "bacon") ArgumentError: wrong number of arguments (2 for 3)
이것은 2
메소드를 제공했음을 의미합니다. 인수이지만 3
이 필요합니다. !
선택적 인수가 있는 유연한 방법
기본값을 제공하여 일부 인수를 선택 사항으로 만들 수 있습니다.
예를 들어 :
def write(file, data, mode = "w") end
이제 write
를 호출할 수 있습니다. 2개의 인수로, 이 경우 mode
기본값과 동일합니다("w"
) 또는 3개의 인수를 전달하여 기본값을 무시하고 다른 결과를 얻을 수 있습니다.
이 기본값을 사용하면 이 메서드를 호출할 때 몇 가지 작업을 줄일 수 있지만 여전히 변경할 수 있습니다.
명확성을 높이기 위해 키워드 인수 사용
필수 및 기본 인수의 단점 중 하나는 순서 종속적이라는 것입니다.
동일한 순서로 인수를 전달해야 함을 의미합니다.
잘못된 순서로 전달한 경우 :
예상치 못한 결과를 얻게 될 것입니다!
예를 들어 write
에서 메소드를 사용하려면 file
로 호출해야 합니다. 먼저 data
그리고 마지막으로 mode
.
def write(file, data, mode) end
키워드 인수를 사용하면 인수의 순서를 변경할 수 있습니다.
예시 :
def write(file:, data:, mode: "ascii") end
이렇게 하면 다른 순서로 메서드를 호출할 수 있습니다.
write(data: 123, file: "test.txt")
그러나 더 중요한 것은 메소드를 호출할 때 인수 의미를 명확하게 볼 수 있다는 것입니다. .
키워드 인수를 자주 사용하지는 않지만 메서드 호출을 명확하게 하고 싶을 때 유용할 수 있습니다.
Point
가 있다고 가정해 보겠습니다. 수업.
다음과 같이 작성할 수 있습니다. :
class Point def initialize(x: , y:) @x, @y = x, y end end point = Point.new(x: 10, y: 20)
이렇게 하면 두 숫자(10 및 20) 중 x
에 해당하는 숫자에 대한 혼동이 발생하지 않습니다. 값 또는 y
가치.
혼란과 오해를 최대한 방지하는 것이 코드를 작성할 때의 주요 목표 중 하나입니다. .
키워드 인수를 사용하는 것이 도움이 된다면 사용하십시오.
생각해 보세요 :
<블록 인용>"키워드 인수를 추가하면 이것을 더 쉽게 이해할 수 있습니까? 아니면 코드에 추가 작업과 혼란이 추가됩니까?"
키워드 인수에 대한 또 다른 점은 누락된 인수에 대해 매우 명시적이라는 것입니다.
예 :
point = Point.new # missing keywords: x, y
키워드 인수를 일반 인수와 결합할 수도 있습니다.
Ruby 내장 메서드에서 관찰한 한 가지 전략은 새 버전에서 키워드 인수와 같은 새로운 선택적 인수를 추가하는 경향이 있다는 것입니다. .
이에 대한 예는 Float#round
에 대한 키워드 인수입니다. , Kernel#clone
&String#lines
Ruby 2.4에서 도입되었습니다.
변수 인수를 사용하여 필요한 만큼 많은 값 캡처
값을 무제한으로 취하고 싶다면?
그런 다음 가변 인수를 사용할 수 있습니다. :
def print_all(*args) end print_all(1, 2, 3, 4, 5)
이렇게 하면 없음을 포함하여 원하는 수의 인수를 사용하여 메서드를 호출할 수 있습니다. 변수 인수는 모든 값이 전달된 배열입니다.
이것을 다른 유형의 인수와 결합할 수 있습니다.
예 :
def print_all(title, *chapters) end
첫 번째 인수를 title
로 사용합니다. , 나머지는 chapters
로 정렬. 가변 인수는 뒤 모든 필수 및 선택적 인수와 모든 키워드 인수 앞.
올바른 순서 사용
다음은 인수를 결합하고 구문 오류를 방지하려는 경우 유효한 인수 순서입니다.
required -> optional -> variable -> keyword
가능한 모든 인수 유형을 표시하는 방법은 다음과 같습니다. :
def testing(a, b = 1, *c, d: 1, **x) p a,b,c,d,x end testing('a', 'b', 'c', 'd', 'e', d: 2, x: 1)
**x
변수 인수와 동일하지만 키워드 인수용입니다. 배열 대신 해시가 됩니다.
포괄적인 주장
드물게 다음과 같은 현상이 나타날 수 있습니다.
def print_all(*) end
이것은 메서드가 모든 인수를 수락하지만 인수로 아무 작업도 수행하지 않음을 의미합니다. 밑줄 문자(_
) 블록 안에 사용하지 않는 인수를 표시합니다.
이를 실제로 사용하려면 super 키워드와 함께 사용할 수 있습니다.
class Food def nutrition(vitamins, minerals) puts vitamins puts minerals end end class Bacon < Food def nutrition(*) super end end bacon = Bacon.new bacon.nutrition("B6", "Iron")
이제 Food의 nutrition
이 인수 목록을 변경하면 Bacon
에서 인수를 변경할 필요가 없습니다. 너무.
요약
Ruby의 강력한 메서드 인수와 사용 방법에 대해 배웠습니다! 필수 인수는 좋은 시작이며 선택적 인수로 유연성을 추가하고 키워드 인수로 명확성을 추가할 수 있습니다.
이 정보가 유용하고 흥미롭기를 바랍니다!
더 많은 사람들이 볼 수 있도록 이 게시물을 트위터에 공유하세요 🙂