【问题标题】:Accessing hash in Ruby like objects in Coffeescript像 Coffeescript 中的对象一样访问 Ruby 中的哈希
【发布时间】:2014-11-25 02:40:22
【问题描述】:

最近我正在使用 Backbone.js 和 Coffeescript 开发一些代码,并且非常习惯于 Coffeescripts 内置的方法来访问作为对象传递的内容:

{ firstname, lastname, @email } = options

相当于:

firstname = options.firstname
lastname = options.lastname
@email = options.email

问题

是否有任何内置的 Ruby 语法可以在 Ruby 的哈希上实现相同的行为?

到目前为止,我设法实现的是:

firstname, lastname, @email = params.values_at(:firstname, :lastname, :email)

但这不是问题的 1:1 解决方案。

编辑#1

Coffeescript 生成的JS:

var firstname, lastname;

firstname = options.firstname, lastname = options.lastname, this.email = options.email;

【问题讨论】:

  • Coffeescript 编译器生成的等效 Javascript 是什么?
  • @DouglasFShearer 添加为有问题的编辑
  • 我希望您知道 Ruby 和 CoffeeScript 之间的区别,因为两者完全不同。两种语言都有不同的语义和语法结构。我认为寻找 1:1 没有任何意义,您所显示的 Ruby 代码对我来说看起来还不错。
  • @Surya 由于 Ruby 对 Coffeescript 的影响很大,我希望有一个 1:1 的等价物。但是是的,我知道存在差异,我只是在寻找解决方案(如果存在)。
  • @jadrol :据我所知,Ruby 中没有任何方法可以像您在 coffescript 中那样。

标签: ruby hash coffeescript


【解决方案1】:

Ruby 没有任何内置解决方案;您的解决方案是正确的方法。

firstname, lastname, @email = params.values_at(:firstname, :lastname, :email)

如果你碰巧知道哈希是一个有序的哈希,并且只包含你想要的值,并且按照你想要的顺序,那么你可以像这样得到所有的值:

# Suppose params = {
#    firstname: …, 
#    lastname: …,
#    email: ….
# }
firstname, lastname, @email = params.values

作为一般提示,如果您碰巧知道哈希是一个有序哈希,并且包含的​​条目比您想要的值多,但值是您想要的顺序,那么您可以获得所有值并跳过那些你不关心的。使用“无用”下划线变量作为占位符的次数不限,以跳过可省略的值:

# Suppose params = {
#    firstname: …, 
#    middlename: …,
#    lastname: …,
#    bithdate: …,
#    email: …, 
#    whatever: …
# }
firstname, _, lastname, _, @email, _  = params.values

【讨论】:

  • 考虑你有:params = { firstname: 'A', lastname: 'Z', email: 'a@z.com', country: 'USA' },如果你这样做:firstname, lastname, _, _, _, @email = params.values你将有@email设置为nil。这不是理想的输出。因此,请提及您必须在 params 哈希内的订单中包含 :firstname, :lastname, :address, :state, :country, :email 才能使您的示例正常工作。
  • 我认为@joelparkerhenderson 提出了一个很好的观点,但你不理解他。他只建议使用“无用”下划线来跳过可省略的值。这是一般提示,目前在我的示例中不存在。
  • @Surya 是的,我会提到这一点。
猜你喜欢
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多