Ruby関数を次のように定義すると:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
最初の2つの引数と最後の引数のみを指定して呼び出すにはどうすればよいですか?どうしてこんな感じじゃないの
ldap_get( base_dn, filter, , X)
可能または可能であれば、どのようにそれを行うことができますか?
これは、現在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
上記のようにメソッドを呼び出すと、動作は期待どおりになります。
ほとんどの場合、オプションハッシュを使用することをお勧めします。
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 )
しかし、最初の2つの引数と最後の引数では呼び出せないという問題があります(以前と同じ問題ですが、最後の引数は異なります)。
この理由は簡単です。Rubyのすべての引数はデフォルト値を持つ必要がないため、指定した方法で呼び出すことはできません。たとえば、あなたの場合、最初の2つの引数にはデフォルト値がありません。
1)メソッドをオーバーロードすることはできません( なぜRubyメソッドオーバーロードをサポートしないのですか? )
2)長さ0以上の配列に対してsplat演算子*を使用して同様の問題を解決しました。次に、可能なパラメーターを渡したい場合、配列として解釈されますが、パラメーターなしでメソッドを呼び出したい場合、何も渡す必要はありません。 Ruby Programming Language186/187ページを参照してください
最近、私はこれを回避する方法を見つけました。配列の要素を保持または破棄するために、オプションのパラメーターを使用して配列クラスにメソッドを作成したかったのです。
これをシミュレートする方法は、配列をパラメーターとして渡し、そのインデックスの値がゼロかどうかを確認することでした。
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