문제

루비 함수를 다음과 같이 정의하면 다음과 같습니다.

def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )

처음 2와 마지막 args 만 공급할 수있는 방법은 무엇입니까? 왜 같은 것이 아닙니다

ldap_get( base_dn, filter, , X)

가능하거나 가능하다면 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

이것은 현재 루비에서는 불가능합니다. '빈'속성을 메소드에 전달할 수 없습니다. 당신이 얻을 수있는 가장 가까운 것은 nil을 통과하는 것입니다.

ldap_get(base_dn, filter, nil, X)

그러나 이것은 ldap :: ldap_scope_subtree가 아닌 범위를 nil로 설정합니다.

당신이 할 수있는 것은 메소드 내에서 기본값을 설정하는 것입니다.

def ldap_get(base_dn, filter, scope = nil, attrs = nil)
  scope ||= LDAP::LDAP_SCOPE_SUBTREE
  ... do something ...
end

이제 위와 같이 방법을 호출하면 행동이 예상대로 될 것입니다.

다른 팁

당신은 거의 항상 옵션 해시를 사용하는 것이 좋습니다.

def ldap_get(base_dn, filter, options = {})
  options[:scope] ||= LDAP::LDAP_SCOPE_SUBTREE
  ...
end

ldap_get(base_dn, filter, :attrs => X)

시간이 계속 이동했고 버전 2 Ruby가 이름이 지정된 매개 변수를 지원합니다.

def ldap_get ( base_dn, filter, scope: "some_scope", attrs: nil )
  p attrs
end

ldap_get("first_arg", "second_arg", attrs: "attr1, attr2") # => "attr1, attr2"

당신이 정의한 방식으로 할 수 없습니다. ldap_get. 그러나 정의하는 경우 ldap_get 이와 같이:

def ldap_get ( base_dn, filter, attrs=nil, scope=LDAP::LDAP_SCOPE_SUBTREE )

이제 당신은 할 수 있습니다 :

ldap_get( base_dn, filter, X )

그러나 이제 당신은 첫 두 개의 Args와 마지막 Arg (이전과 동일한 문제이지만 이제 마지막 Arg는 다릅니다)로 호출 할 수 없다는 문제가 있습니다.

이에 대한 이론적 근거는 간단합니다. 루비의 모든 인수는 기본값을 가질 필요가 없으므로 지정된 방식으로 호출 할 수는 없습니다. 예를 들어, 첫 두 인수는 기본값이 없습니다.

1) 메소드를 과부하 할 수 없습니다 (Ruby Support Method가 과부하되지 않는 이유는 무엇입니까?) 그렇다면 왜 새로운 방법을 쓰지 않겠습니까?

2) SPLAT 연산자 *를 0 이상의 길이에 대해 비슷한 문제를 해결했습니다. 그런 다음 매개 변수를 전달하려면 배열로 해석되지만 매개 변수없이 메소드를 호출하려면 아무것도 전달할 필요가 없습니다. 보다 루비 프로그래밍 언어 186/187 페이지

최근에 나는 이것에 대한 방법을 찾았다. 배열 클래스에서 옵션 매개 변수가있는 메소드를 만들어 배열의 요소를 유지하거나 폐기하고 싶었습니다.

내가 이것을 시뮬레이션 한 방식은 배열을 매개 변수로 전달한 다음 해당 색인의 값이 nil인지 아닌지 확인하는 것입니다.

class Array
  def ascii_to_text(params)
    param_len = params.length
    if param_len > 3 or param_len < 2 then raise "Invalid number of arguments #{param_len} for 2 || 3." end
    bottom  = params[0]
    top     = params[1]
    keep    = params[2]
    if keep.nil? == false
      if keep == 1
        self.map{|x| if x >= bottom and x <= top then x = x.chr else x = x.to_s end}
      else
        raise "Invalid option #{keep} at argument position 3 in #{p params}, must be 1 or nil"
      end
    else
      self.map{|x| if x >= bottom and x <= top then x = x.chr end}.compact
    end
  end
end

다른 매개 변수로 수업 방법을 사용해보십시오.

array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126, 1]) # Convert all ASCII values of 32-126 to their chr value otherwise keep it the same (That's what the optional 1 is for)

산출: ["1", "2", "a", "b", "c"]

좋아요, 계획대로 작동합니다. 이제 배열에서 세 번째 매개 변수 옵션 (1)을 전달하지 않으면 어떻게되는지 확인해 보겠습니다.

array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126]) # Convert all ASCII values of 32-126 to their chr value else remove it (1 isn't a parameter option)

산출: ["a", "b", "c"]

보시다시피, 배열의 세 번째 옵션이 제거되어 메소드의 다른 섹션을 시작하고 범위에 있지 않은 모든 ASCII 값을 제거합니다 (32-126).

또는 매개 변수에서 값을 NIL로 발행 할 수있었습니다. 다음 코드 블록과 유사하게 보입니다.

def ascii_to_text(top, bottom, keep = nil)
  if keep.nil?
    self.map{|x| if x >= bottom and x <= top then x = x.chr end}.compact
  else
    self.map{|x| if x >= bottom and x <= top then x = x.chr else x = x.to_s end}
end

가능합니다 :) 정의를 변경하십시오

def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )

에게

def ldap_get ( base_dn, filter, *param_array, attrs=nil )
scope = param_array.first || LDAP::LDAP_SCOPE_SUBTREE

범위는 이제 첫 번째 배열에 있습니다. 당신이 3 개의 인수를 제공하면, 당신은 base_dn, 필터 및 attrs를 할당하고 param_array는 [] 4 이상의 인수가되면 param_array가 [argument1, or_more, and_more]가됩니다.

단점은 ... 불분명 한 솔루션입니다. 정말 추악합니다. 이것은 루비에서 기능 호출 중간에 논쟁을 할 수 있다고 대답하는 것입니다. :)

당신이해야 할 또 다른 일은 기본 값의 범위를 다시 작성하는 것입니다.

이름이 지정된 변수를 사용하면 더 읽기 쉬운 코드로 이어질 수 있지만 부분 응용 프로그램 으로이 작업을 수행 할 수 있습니다. John Resig는 2008 년 JavaScript에서 수행하는 방법에 대한 블로그 기사를 썼습니다. http://ejohn.org/blog/partial-functions-in-javascript/

Function.prototype.partial = function(){
  var fn = this, args = Array.prototype.slice.call(arguments);
  return function(){
    var arg = 0;
    for ( var i = 0; i < args.length && arg < arguments.length; i++ )
      if ( args[i] === undefined )
        args[i] = arguments[arg++];
    return fn.apply(this, args);
  };
};

루비에 동일한 원칙을 적용하는 것이 가능할 것입니다 (프로토 타입 상속 제외).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top