Ruby可选参数

Bru*_*nes 120 ruby optional-parameters

如果我定义这样的Ruby函数:

def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Run Code Online (Sandbox Code Playgroud)

我怎么称它只提供前2个和最后一个args?为什么不是这样的

ldap_get( base_dn, filter, , X)
Run Code Online (Sandbox Code Playgroud)

可能的,或者如果可能,怎么办?

jsh*_*hen 137

使用选项哈希几乎总是更好.

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

ldap_get(base_dn, filter, :attrs => X)
Run Code Online (Sandbox Code Playgroud)

  • 一个常见的策略是在传入的内容中使用默认选项hash和merge:`options = default_options.merge(options)` (23认同)
  • 我不鼓励这样做,因为这些选项不会告诉您方法所期望的内容或默认值是什么 (7认同)

tom*_*fro 130

目前ruby无法做到这一点.您不能将"空"属性传递给方法.你能得到的最接近的是通过nil:

ldap_get(base_dn, filter, nil, X)
Run Code Online (Sandbox Code Playgroud)

但是,这会将范围设置为nil,而不是LDAP :: LDAP_SCOPE_SUBTREE.

您可以做的是在方法中设置默认值:

def ldap_get(base_dn, filter, scope = nil, attrs = nil)
  scope ||= LDAP::LDAP_SCOPE_SUBTREE
  ... do something ...
end
Run Code Online (Sandbox Code Playgroud)

现在,如果您按上述方法调用方法,则行为将如您所愿.

  • 这个方法有点困难:例如,如果你试图使`scope`的默认值为true而你传入`false`,那么`scope || = true`将不起作用.它的计算结果与`nil`相同,并将其设置为"true" (21认同)
  • 每个人都说`scope || = true`有多糟糕,我很惊讶没有人提到更好的方法是使用`scope = LDAP :: LDAP_SCOPE_SUBTREE如果scope.nil?`.当然,即使假设'nil`是无效值. (7认同)
  • 这个回答3年后,是否有可能使用当前版本的ruby? (4认同)

ste*_*lag 51

时间已经过去了,因为版本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"
Run Code Online (Sandbox Code Playgroud)