我正在使用一次性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?
功能?
当我的脚本中没有任何私有声明时,为什么它会作为私有方法出现?
答案 0 :(得分:2)
Kernel
vs instance method,self
vs argument def is_post?(hash)
...
end
通过以这种方式定义方法,您正在为Kernel
定义方法。您可以选择通过Kernel.is_post?(hash)
或is_post?(arg)
调用此方法。除非item
是Kernel
对象,否则您不会为其定义方法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