如何使Ruby方法显示他们期望的类型

时间:2015-03-25 01:37:17

标签: ruby naming-conventions

使用Ruby方法名表达意图的最佳做法是什么?

例如,使用以下内容:

class Formula
  attr_accessor :steps

  def find_step(key)
    @steps.find {|s| s.name == key }
  end

end

class Step
  attr_accessor :name
end

Formula#find_step方法需要Symbol,但它可以很容易地采用Step类型并检查名称是否匹配。我可以重命名方法find_step_by_name,但它仍然不清楚name是什么。它是一个字符串还是一个符号?或者它与Step对象上的名称匹配?

修改:标记为Does Ruby support type-hinting?的可能副本 我不是在询问是否可能,我在询问有关命名的问题。

3 个答案:

答案 0 :(得分:1)

我认为find_step_by_name明确表示期望name而不是step可能有一个名字。如果您不确定是否支持字符串或符号,请同时允许:

  def find_step_by_name(name)
    @steps.find { |s| s.name == name.to_s }
  end

答案 1 :(得分:1)

在Ruby2.1之后我认为以下解决方案很好。

def find_by(name:)
  # and you can check if type of name is what you expect as you need.
  # But that is not duck-typingy.
end

答案 2 :(得分:1)

我认为这个问题的最佳答案是选择参数名称。如果您打算将符号传递给find_by方法,为什么不这样做:

def find_by(symbol)
  @steps.find {|s| s.name == symbol }
end

但是,我认为这是最明确的选择:

def find_by_name(symbol)
  @steps.find {|s| s.name == symbol }
end

我不同意使用关键字解决了这个问题。它所做的就是改变字符串或符号传递给方法的方式。

def find_by(name:)
  puts name
end

find_by name: 'this'  # name has to be passed in via hash
find_by name: :that

def find_by(name)
  puts name
end

find_by 'this' # name is passed in directly
find_by :that

它没有解决'name'并不意味着传递了什么类型的对象的问题。

我认为如果你在方法中传递多个参数,关键字真的很有用,因为它们使得代码在使用时更具可读性。

def mass(width:, height:, density:)
  width * height * density
end

mass width: 3, height: 11, density: 0.5

这意味着每次用于计算传入的内容时,您都不必转到质量方法定义。它还消除了使参数顺序正确的必要性。这也可行:

mass width: 3, density: 0.5, height: 11

但对于一个只有一个参数的方法,我认为你只是通过使用关键字来增加复杂性。