0

我正在使用一次性 Ruby 脚本(因此不在显式定义的模块或类中),并且很难从 .each 块中访问我之前在脚本中定义的函数。

def is_post?(hash)
  if hash["data"]["post"] == "true" #yes, actually a string
    true
  else 
    false
  end
end

#further down

threads["data"]["children"].each do |item|
  puts item["data"]["title"] unless item.is_post?
end

结果:

in 'block in <top (required)>': private method `is_post?' called for #<Hash:0x007f9388008cf0\> (NoMethodError)

threads是一个非常非常嵌套的哈希。散列,包含数组的散列,数组包含带有标头数据的散列,其中包含带有其余详细信息的另一个散列。有点乱,但我没有编写生成该模块的模块:P

这个想法是遍历数组并从每个数组中检索数据。

我的问题是:

  • 我需要采取什么样的诡计才能is_post?从块内访问我的功能?

  • 当我的脚本中没有任何私有声明时,为什么它会作为私有方法出现?

4

2 回答 2

2

Kernelvs 实例方法,selfvs 参数

def is_post?(hash)
  ...
end

通过以这种方式定义方法,您正在为Kernel. 您可以选择通过 或 调用此Kernel.is_post?(hash)方法is_post?(arg)。除非itemKernel对象,否则您不会is_post?为它定义方法。

你的方法只需要一个参数。如果 item 有一个is_post?方法,通过做item.is_post?,你不是提供一个参数,而只是提供self给方法。

解决方案

你可能应该更换

item.is_post?

经过

is_post?(item)
于 2012-12-27T17:55:44.890 回答
1

您不想调用is_post?(就像错误消息所说item的那样)。Hash你想要的是以下内容:

threads["data"]["children"].each do |item|
  puts item["data"]["title"] unless is_post?(item)
end
于 2012-12-27T17:43:40.143 回答