我没有太多编程经验.但是,在我看来,Struct似乎有点像Hash.

  • Struct能做好什么?
  • Struct能做什么,Hash不能做什么?

在谷歌搜索之后,Struct的概念在C中很重要,但我对C知之甚少.

推荐答案

struct 与使用hashmaps的不同之处在于(除了代码的外观):

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

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

作为旁注:C struct 与ruby struct 几乎没有任何关系,所以不要让自己被这搞糊涂了.

Ruby相关问答推荐

定义Struct时如何指定成员的类型?

多线程期间的 MRI ruby​​ 内存访问特性

RSpec 是否有 python 类似功能来做 TDD?

是否应该在生产时缩小服务器代码?

查看 Savon 请求 XML 而不发送到服务器

each_with_object 应该如何工作?

Ruby 将字符串转换为方法名

这些 Ruby 命名空间约定之间有什么区别?

我如何 expect期望在 RSpec 中引发异常的东西?

比较ruby中的两个字符串

如何从最后一个元素开始遍历数组?

为什么在 ruby​​ / rails / activerecord 中并不总是需要 self ?

在Ruby中第一个=符号之后获取子字符串

在 RSpec 测试期间 suppress 控制台输出

Ruby中的每个块都可以有一行吗?

Ruby 中的标准文件命名约定

Ruby NOT Rails 中有复数函数吗?

Mountain Lion rvm 安装 1.8.7 x11 错误

如何在 macOS 上卸载 rbenv?

Ruby - 用另一个字符串替换第一次出现的子字符串