如何验证传递给Ruby中的方法的函数?

Tel*_*hus 1 ruby parameters methods

我正在编写一个库来对Ruby中的字节进行人性化处理(例如,将字节数1025转换为字符串1.1K),而我仍然坚持设计的一个元素.

该计划是Numeric使用一种humanize方法进行扩展,该方法在对数字进行调用时返回对人类友好的字符串.看着源后数::字节::人(Perl模块,我想了很多本),我决定把两个选项添加到方法:一是使用1000个字节的块和一个使用floor,而不是ceil为默认舍入功能.

为了最大限度地灵活,方法的定义使用参数的哈希,以便用户可以更改一个或两个选项.如果未传递任何参数,则使用默认哈希.这给了我这样的东西:

def humanize(params = {})
  params = {:block => 1024, :r_func => lambda }.merge params
  # yada yada
end
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想让用户传递一个函数作为值params[:r_func],但我无法弄清楚如何验证它是ceil或者floor.因为我无法理解这一点,所以我最终做了以下事情,感觉非常笨拙:

  def humanize(params = {})
    params = {:block => 1024, :r_func => 'ceil' }.merge params
    if params[:r_func].eql? 'ceil'
      params[:r_func] = lambda { |x| x.ceil }
    elsif params[:r_func].eql? 'floor'
      params[:r_func] = lambda { |x| x.floor }
    else 
      raise BadRound, "Rounding method must be 'ceil' or 'floor'."
    end
    # blah blah blah
  end
Run Code Online (Sandbox Code Playgroud)

如果有人知道偷看Ruby lambda包含的方法的技巧,我很乐意听到它.(我也很高兴听到任何其他设计建议.)谢谢.

Avd*_*vdi 7

没有理由让用户通过一个方法,如果你是一个严苛的关于他们被允许传递的东西(你知道除了天花板和地板还有其他的舍入方案,对吗?)

如果要将用户限制为天花板和地板,只需允许它们传递符号:ceiling或者:floor.更灵活的设计是允许方法采用接收单个参数的块,即要舍入的数字.然后用户可以使用他们喜欢的任何舍入算法,包括自定义算法.

顺便说一句,Numeric#humanize属于那种具有如此流行名称的monkeypatches类别,除了一个小的个人项目之外,你可能会遇到名称空间冲突(并产生微妙的错误).