访问Ruby块中的函数

时间:2012-12-27 17:40:56

标签: ruby function hash scope private

我正在使用一次性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?功能?

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

2 个答案:

答案 0 :(得分:2)

Kernel vs instance method,self vs argument

def is_post?(hash)
  ...
end

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

您的方法只需要一个参数。如果项目具有is_post?方法,则通过执行item.is_post?,您不会为方法提供参数,而只提供self

解决方案

您可能应该替换

item.is_post?

通过

is_post?(item)

答案 1 :(得分:1)

您不想在is_post?上调用item(这是Hash,如错误消息所示)。 你想要的是以下几点:

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