相关疑难解决方法(0)

什么时候在Ruby中使用Struct而不是Hash更好?

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)

什么是真实世界的情况,我应该更喜欢结构(和为什么),以及选择一个在另一个上的警告或陷阱是什么?

ruby

47
推荐指数
5
解决办法
8109
查看次数

hash ['key']到Ruby中的hash.key

我有一个哈希

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 hash activerecord

45
推荐指数
5
解决办法
2万
查看次数

将哈希转换为结构

如何将哈希转换为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

43
推荐指数
6
解决办法
2万
查看次数

Ruby Structs中的命名参数

如果这是一个显而易见的问题,我对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)

ruby struct named-parameters

30
推荐指数
5
解决办法
9036
查看次数

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我认为"匿名"一词允许这样,但事实并非如此.

ruby

5
推荐指数
2
解决办法
2949
查看次数

Rails编辑序列化的JSON数据

我有一个存储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)

ruby json ruby-on-rails ruby-on-rails-4

5
推荐指数
1
解决办法
3279
查看次数