web-dev-qa-db-ja.com

Rubyオプションのパラメーター

Ruby関数を次のように定義すると:

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

最初の2つの引数と最後の引数のみを指定して呼び出すにはどうすればよいですか?どうしてこんな感じじゃないの

ldap_get( base_dn, filter, , X)

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

120
Bruno Antunes

これは、現在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

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

130
tomafro

ほとんどの場合、オプションハッシュを使用することをお勧めします。

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

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

時間が進み、バージョン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"
51
steenslag

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つの引数にはデフォルト値がありません。

3
Chris Bunch

1)メソッドをオーバーロードすることはできません( なぜRubyメソッドオーバーロードをサポートしないのですか?

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

1
rupweb

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

これをシミュレートする方法は、配列をパラメーターとして渡し、そのインデックスの値がゼロかどうかを確認することでした。

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
0
Singularity