【问题标题】:Confusion between hashes and symbols哈希和符号之间的混淆
【发布时间】:2019-05-12 07:52:42
【问题描述】:

请您帮助我理解哈希背后的概念,尤其是当我们使用符号时。

:name 是一个符号吧?

我们可以使用符号作为散列权的键吗?

:namename: 例如:这是两种语法,但它描述了一个符号,对吗?

例如,当我们有这个时:

Geocode.configure(

units: :km

)

这里的units 引用了configure 函数中称为units 的指定参数,对吗? :km 是我们要通过变量单元发送的符号还是我错了?

最后一个例子:

validates :home_type, presence: true

这里我们尝试向 validates 函数发送符号 home_type 对吗?

第二个参数被命名为“存在”,我们想通过这个变量发送布尔值 true 吗?

很抱歉,如果您不理解我的问题,请随时问我。

我对这些语法有很多理解。

非常感谢!

【问题讨论】:

  • "units 引用了一个名为units 的指定参数" – 你无法真正分辨这是关键字参数还是散列。 Ruby 2.x 在它们之间透明地转换,所以foo(a: 1)foo({a: 1}) 实际上是相同的。 Ruby 3.x 将有“真正的”关键字参数。
  • 下面的答案解释了符号语法糖。对于何时使用字符串作为键和何时使用符号作为键之间的区别,我建议查看When to use symbols instead of strings in Ruby?

标签: ruby-on-rails ruby hash symbols


【解决方案1】:
Geocode.configure(units: :km)

我们将哈希传递给configure 方法。这个哈希{units: :km}{:units => :km} 的方便语法。所以一个带有键符号 (:units) 和值符号 (:km) 的键值对的哈希。

validates :home_type, presence: true

在这里,我们将符号 :home_type 和哈希 {presence: true}{:presence => true} 传递给 validates 方法。所以key是:presence符号,value是布尔值true

【讨论】:

  • 或者我们传递了一个关键字参数units,你永远不会知道;-)
  • 你是对的!哈希或关键字参数:)
【解决方案2】:

这是非常基本的,只不过是 ruby​​ 中的简化约定

validates :home_type, presence: true, if: :check_user

类似于

validates :home_type, { :presence => true, :if => :check_user }

所以当我写成时,

link_to 'Edit', edit_path(user), class: 'user_one', id: "user_#{user.id}"

在上面,link_to 是 ActionHelper 方法,它接受 3 个参数,其中最后一个是哈希 { class: 'user_one', id: "user_#{user.id}" }

【讨论】:

  • “除了 Rails 中的简化约定”——这不是 Rails 特有的,Rails 不能改变 Ruby 的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2019-03-22
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
相关资源
最近更新 更多