Programing

함수 (* args)에 해시 전달 및 의미

crosscheck 2020. 11. 2. 07:40
반응형

함수 (* args)에 해시 전달 및 의미


다음과 같은 관용구를 사용할 때 :

def func(*args)
  # some code
end

의 의미는 *args무엇입니까? 이 특정 질문을 검색하는 것은 꽤 어려웠고 아무것도 찾을 수 없었습니다.

모든 주장이 실제로 나타나는 것처럼 보이 args[0]므로 다음과 같은 방어 코드를 작성합니다.

my_var = args[0].delete(:var_name) if args[0]

하지만 내가 놓치고있는 더 좋은 방법이 있다고 확신합니다.


*은 IS 플랫 (또는 별표) 연산자. 메서드 컨텍스트에서 가변 길이 인수 목록을 지정합니다. 귀하의 경우, 모든 인수에 전달 func라는 배열에 넣어됩니다 args. 다음과 같이 가변 길이 인수 앞에 특정 인수를 지정할 수도 있습니다.

def func2(arg1, arg2, *other_args)
  # ...
end

이 메서드를 호출한다고 가정 해 보겠습니다.

func2(1, 2, 3, 4, 5)

당신이 검사하는 경우 arg1, arg2그리고 other_argsfunc2지금, 당신은 다음과 같은 결과를 얻을 것이다 :

def func2(arg1, arg2, *other_args)
  p arg1.inspect       # => 1
  p arg2.inspect       # => 2
  p other_args.inspect # => [3, 4, 5]
end

귀하의 경우에는 해시를 인수로 전달하는 것 같습니다 func.이 경우 args[0]관찰하는 것처럼 해시가 포함됩니다.

자원:


OP의 의견에 따라 업데이트

Hash를 인수로 전달하려면 splat 연산자를 사용하지 않아야합니다. Ruby를 사용하면 메서드 호출에서 해시를 지정하는 괄호 (주의, 계속 읽기)를 포함하여 괄호를 생략 할 수 있습니다 . 따라서:

my_func arg1, arg2, :html_arg => value, :html_arg2 => value2

다음과 같다

my_func(arg1, arg2, {:html_arg => value, :html_arg2 => value2})

Ruby가 =>인수 목록에서 연산자를 볼 때 명시적인 {...}표기법 없이도 인수를 Hash로 취하는 것을 알고 있습니다 (해시 인수가 마지막 인수 인 경우에만 적용됩니다!).

이 해시를 수집하려면 특별한 작업을 수행 할 필요가 없습니다 (메소드 정의에서 기본값으로 빈 해시를 지정하고 싶을 것입니다).

def my_func(arg1, arg2, html_args = {})
  # ...
end

참고 URL : https://stackoverflow.com/questions/3701264/passing-a-hash-to-a-function-args-and-its-meaning

반응형