Ruby中匿名结构的目的是什么?

Ben*_*Ben 5 ruby

它们可以像这样定义

Struct.new(:x, :y)

但是可以用它们做些什么呢?具体来说,我如何创建这样的结构的实例?这不起作用

Struct.new(:x => 1, :y => 1)

(你明白了TypeError: can't convert Hash into String)

我正在使用Ruby 1.9.2.

更新:

好的指针到目前为止,谢谢.我想我之所以这样说的原因是我有几次发现自己想要这样做

Struct.new(:x => 1, :y => 1)

这样我就可以在我可以写的地方传递一个对象,obj.x而不是实例化一个哈希并且必须写obj[:x].在这种情况下,我希望结构真的是匿名的 - 我不想通过命名从Struct.new调用返回的内容来污染我的命名空间.正如已经建议的那样,最接近的是

Struct.new(:x, :y).new(1, 1)

但你觉得苹果怎么样?我不确定.期望能够一次性定义和实例化匿名结构(作为核心Ruby的一部分)是否合理?我想当我阅读官方Ruby文档时,Struct.new我认为"匿名"一词允许这样,但事实并非如此.

Pao*_*tti 19

Struct.new返回一个Class,所以你可以,例如,将它分配给一个常量,如下所示:

Point = Struct.new(:x, :y)
Run Code Online (Sandbox Code Playgroud)

或者它的子类:

class Point < Struct.new(:x, :y)
  # custom methods here
  # ...
end
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都可以像这样使用结果类:

Point.new(3, 5)
Run Code Online (Sandbox Code Playgroud)

如果您不想创建特定的类(因为您只需要实例化该类的对象一次),请考虑使用OpenStruct:

require 'ostruct'

point = OpenStruct.new(:x => 3, :y => 5)
Run Code Online (Sandbox Code Playgroud)


sun*_*ity 5

首先创建一个结构体,然后可以创建它的实例。这是一种无需声明类即可创建数据对象的方法。基本上它与哈希相同,但访问对象更干净。您可以通过普通访问器方法引用它来从中获取内容。

http://www.ruby-doc.org/core-1.9.3/Struct.html

# Create a structure with a name in Struct
Struct.new("Customer", :name, :address)    #=> Struct::Customer
Struct::Customer.new("Dave", "123 Main")   #=> #<struct Struct::Customer name="Dave", address="123 Main">

# Create a structure named by its constant
Customer = Struct.new(:name, :address)     #=> Customer
Customer.new("Dave", "123 Main")           #=> #<struct Customer name="Dave", address="123 Main">
Run Code Online (Sandbox Code Playgroud)