ruby - 哪个更地道 : positional arguments or option hashes?

标签 ruby methods variable-assignment

我是 Ruby 的新手,我见过构造函数以几种不同的方式完成,我很好奇哪种方式更地道?这些是我见过的 2 个最常见的变体:

直接赋值:

class Foo

  attr_accessor :id
  attr_accessor :name

  def initialize(id, name)
    @id = id
    @name = name
  end

end

哈希传递:

class Foo

  attr_accessor :id
  attr_accessor :name

  def initialize(options)
    @id = options[:id]
    @name = options[:name]
  end

end

哪个是最惯用的,或者是否有我未在此处介绍的替代方法?

最佳答案

方法签名的数量

您所说的“直接赋值”实际上只是一个带有位置参数的方法签名。从哈希参数赋值是你在遗留代码中经常看到的东西,因为 2.0 版之前的 Ruby 解释器没有 keyword arguments。 ,而选项哈希是模拟它们的好方法。

两者都不是更惯用的;每个都有不同的用例。通常,当您想强制执行方法的元数时,位置参数更好,而当您想避免复杂的、依赖于顺序的签名并愿意自己处理 nils 和元数问题时,选项哈希更好。

使用显式签名以确保清晰度

如果您使用的是 Ruby 2.0 或更高版本,我建议坚持使用位置参数或关键字参数以使您的方法签名明确。作为一个额外的好处,具有良好变量名的显式签名减少了您需要编写的文档量; RDoc 等工具将很好地记录表达签名,但选项哈希很少是不言自明的。

关于ruby - 哪个更地道 : positional arguments or option hashes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204952/

相关文章:

testing - 每次调用 mock 上的方法时,如何让 Mockito 做一些事情?

python - Bottle 框架和 OOP,使用方法而不是函数

从c代码调用freebsd中的内核变量

javascript - AngularJS $q 和 promise 以及赋值困惑

Ruby 在模型中包含模块的单一方法

java - boolean 赋值与声明

c# - 从外部应用程序在 C# 中引发事件?

ruby - 结合 'uniq'和 'compact'的数组方法

ruby - 为什么 cucumber 钩子(Hook)方法不是小写的?

ruby-on-rails - 载波,保存记录?