带有块的Hash.new返回空哈希

时间:2013-11-20 00:33:49

标签: ruby hash

为什么这个哈希会返回空?它在我的文档模型中:

def li_hash
  li_hash = Hash.new do |share|
    share.comment "#{self.remove_html(self.components.first.body[0..300])}..."
    share.content do |c|
      c.title "#{self.title}"
      c.description "Read this"
      c.tag! "submitted-url", "#{root_url.gsub(/\/$/, '')}#{share_path(self.user.ftp, self)}"
      c.tag! "submitted-image-url", "#{root_url.gsub(/\/$/, '')}#{self.component.image_newsletter.path}"
    end
    share.visibility.code "anyone"
  end
end

我是这样从控制台调用的:

d = Document.find(328)
d.li_hash

它只会返回:

=> {} 

记录有效且全部。有什么想法吗?我正在尝试将这个哈希值提交给LinkedIn,但它显然无法正常工作。

2 个答案:

答案 0 :(得分:1)

Hash.new始终返回空哈希。您指定的块仅用于在使用哈希中尚不存在的密钥访问哈希时提供默认值,每个http://www.ruby-doc.org/core-1.9.3/Hash.html#method-c-new表示:

  

如果指定了一个块,则将使用哈希对象调用它   键,应该返回默认值。这是街区   如果需要,有责任将值存储在哈希值中。

在更新哈希之前,哈希中没有任何内容。

答案 1 :(得分:1)

您实际上并没有在此代码中设置任何内容。另外,我认为您可能误解了将块传递给哈希的方法。当您将块传递给散列时,您可以做的是设置一个lambda,该lambda将在每次后续添加到散列时执行。

正如documentation for Hash.new所述:

  

如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值。如果需要,该块负责将值存储在哈希值中。

如果你试图以确定的方式在哈希中设置一堆参数,你应该像这样明确地声明哈希:

{
  :comment => "#{self.remove_html(self.components.first.body[0..300])}...",
  :content => {
    :title => "#{self.title}",
    :description => "Read this",
  }
}

然后如果您有任何副作用(如tag!方法),请单独进行。