ruby - 什么时候在 Ruby 中使用 Struct 而不是 Hash?

标签 ruby hash struct

我没有太多的编程经验。但是,对我来说,Struct 似乎有点类似于 Hash。

  • Struct 可以做什么?
  • 有没有什么 Struct 可以做而 Hash 不能做的?

google了一下,Struct的概念在C中很重要,但我对C了解不多。

最佳答案

结构在以下方面不同于使用 HashMap (除了代码的外观):

  • 结构具有一组固定的属性,而您将新键添加到散列。
  • 调用结构实例上不存在的属性将导致 NoMethodError,而从哈希中获取不存在的键的值只会返回 nil。
  • 不同结构的两个实例永远不会相等,即使结构具有相同的属性并且实例具有相同的值(即 Struct.new(:x).new(42) == Struct.new( :x).new(42) 为假,而 Foo = Struct.new(:x); Foo.new(42)==Foo.new(42) 为真) .
  • 结构的 to_a 方法返回值数组,而散列上的 to_a 为您提供键值对数组(其中“对”表示“二元数组")
  • 如果 Foo = Struct.new(:x, :y, :z) 您可以执行 Foo.new(1,2,3) 来创建一个实例Foo 而不必拼出属性名称。

所以回答这个问题:当你想用一组已知的属性对对象建模时,使用结构。当您想任意建模时使用 HashMap (例如,计算每个单词在字符串中出现的频率或将昵称映射到全名等绝对不是结构的工作,而用姓名、年龄和地址建模人将是非常适合 Person = Struct.new(name, age, address))。

作为旁注:C 结构与 ruby​​ 结构几乎没有关系,所以不要让自己对此感到困惑。

关于ruby - 什么时候在 Ruby 中使用 Struct 而不是 Hash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3275594/

相关文章:

c - 如何为 C 中的数组元素提供可读的名称?

ruby - 在 `initialize` 方法中访问实例变量

ruby-on-rails - rails : How to add scope to pg_search with location search?

ruby-on-rails - 当连接到多个数据库时,Rails 从其他请求返回结果。

c++ - 仅匹配集合中的某些字段

c# - 哈希码作为键控集合中的键

c++ - 当结构定义在头文件中时,如何在 main() 中创建结构数组?

Ruby Event Machine 停止或终止延迟操作

security - 通过比较证书指纹进行 SSL 身份验证?

c - 分配或传递缓冲区?