Ruby Struct允许使用一组访问器生成实例:
# Create a structure named by its constant
Customer = Struct.new(:name, :address) #=> Customer
Customer.new("Dave", "123 Main") #=> #<Customer name="Dave", address="123 Main">
Run Code Online (Sandbox Code Playgroud)
这看起来既方便又强大,但Hash做了类似的事情:
Customer = {:name => "Dave", :address => "123 Main"}
Run Code Online (Sandbox Code Playgroud)
什么是真实世界的情况,我应该更喜欢结构(和为什么),以及选择一个在另一个上的警告或陷阱是什么?
我有一个哈希
foo = {'bar'=>'baz'}
Run Code Online (Sandbox Code Playgroud)
我想打个电话 foo.bar #=> 'baz'
我的动机是将activerecord查询重写为原始sql查询(使用Model#find_by_sql).这将返回一个带有SELECT子句值作为键的哈希.但是,我现有的代码依赖于object.method点表示法.我想做最小的代码重写.谢谢.
编辑:看来Lua有这个功能:
point = { x = 10, y = 20 } -- Create new table
print(point["x"]) -- Prints 10
print(point.x) -- Has exactly the same meaning as line above
Run Code Online (Sandbox Code Playgroud) 如何将哈希转换为ruby中的结构?
鉴于这种:
h = { :a => 1, :b => 2 }
Run Code Online (Sandbox Code Playgroud)
我想要一个结构,这样:
s.a == 1
s.b == 2
Run Code Online (Sandbox Code Playgroud) 如果这是一个显而易见的问题,我对Ruby很新,所以道歉.
我想在实例化Struct时使用命名参数,即能够指定Struct中哪些项获取什么值,并将其余项默认为nil.
例如,我想做:
Movie = Struct.new :title, :length, :rating
m = Movie.new :title => 'Some Movie', :rating => 'R'
Run Code Online (Sandbox Code Playgroud)
这不起作用.
所以我想出了以下内容:
class MyStruct < Struct
# Override the initialize to handle hashes of named parameters
def initialize *args
if (args.length == 1 and args.first.instance_of? Hash) then
args.first.each_pair do |k, v|
if members.include? k then
self[k] = v
end
end
else
super *args
end
end
end
Movie = MyStruct.new :title, :length, :rating
m = Movie.new :title => 'Some Movie', :rating => …Run Code Online (Sandbox Code Playgroud) 它们可以像这样定义
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我认为"匿名"一词允许这样,但事实并非如此.
我有一个存储JSON数据的列.当它处于编辑状态时,我不知道如何显示它.
serialize :value, JSON
= f.fields_for :value do |ff|
.form-group
= ff.label :short
= ff.text_field :short, class: 'form-control'
.form-group
= ff.label :long
= ff.text_field :long, class: 'form-control'
Run Code Online (Sandbox Code Playgroud)