123

Ruby 関数を次のように定義すると、次のようになります。

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

最初の 2 つの引数と最後の引数のみを指定して呼び出すにはどうすればよいですか? なぜ次のようなものではないのですか

ldap_get( base_dn, filter, , X)

可能な場合、または可能であれば、どのように行うことができますか?

4

8 に答える 8

131

現在、これは ruby​​ では不可能です。「空の」属性をメソッドに渡すことはできません。あなたが得ることができる最も近いものは、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

上記のようにメソッドを呼び出すと、動作は期待どおりになります。

于 2009-05-01T16:24:02.087 に答える
54

時は流れ、バージョン 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"
于 2014-07-14T19:00:27.660 に答える
3

あなたが定義した方法でそれを行うことはできませんldap_get。ただし、次のように定義するldap_getと:

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

次のことができるようになりました。

ldap_get( base_dn, filter, X )

しかし、最初の2つの引数と最後の引数で呼び出すことができないという問題があります(以前と同じ問題ですが、最後の引数が異なります)。

この理由は単純です。Ruby のすべての引数はデフォルト値を持つ必要がないため、指定した方法で呼び出すことはできません。たとえば、あなたの場合、最初の 2 つの引数にはデフォルト値がありません。

于 2009-05-01T16:21:18.210 に答える
1

1) メソッドをオーバーロードできない ( Ruby はメソッドのオーバーロードをサポートしていないのはなぜですか? ) では、まったく新しいメソッドを作成しないのはなぜですか?

2) 0 以上の長さの配列に対してスプラット演算子 * を使用して、同様の問題を解決しました。次に、可能なパラメーターを渡したい場合、それは配列として解釈されますが、パラメーターなしでメソッドを呼び出したい場合は、何も渡す必要はありません。Ruby プログラミング言語の 186/187 ページを参照してください。

于 2014-03-12T12:05:00.090 に答える
0

最近、これを回避する方法を見つけました。配列内の要素を保持または破棄するために、オプションのパラメーターを使用して配列クラスにメソッドを作成したいと考えていました。

これをシミュレートする方法は、配列をパラメーターとして渡し、そのインデックスの値が 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"]

いいですね、計画通りに動作します。では、配列の 3 番目のパラメーター オプション (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"]

ご覧のとおり、配列の 3 番目のオプションが削除されたため、メソッドの別のセクションが開始され、範囲外のすべての 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
于 2014-01-28T18:53:47.133 に答える
-1

名前付き変数を使用すると、間違いなくコードが読みやすくなりますが、部分適用でこれを行うこともできます。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);
  };
};

おそらく Ruby でも同じ原則を適用できるでしょう (プロトタイプの継承を除く)。

于 2016-03-09T09:49:00.280 に答える
-1

可能です:)定義を変更するだけです

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、filter、attrs が割り当てられ、param_array は [] になります。引数が 4 つ以上の場合、param_array は [argument1、or_more、and_more] になります。

欠点は...それは不明確な解決策であり、本当に醜いです。これは、ruby では関数呼び出しの途中で引数を省略できるという回答です:)

もう1つやらなければならないことは、スコープのデフォルト値を書き直すことです。

于 2010-11-09T13:50:30.150 に答える