0

私は 1 回限りの 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

Kernel対インスタンスメソッド、self対引数

def is_post?(hash)
  ...
end

そのようにメソッドを定義することで、 のメソッドを定義していることになりますKernelKernel.is_post?(hash)、またはを介し​​てこのメ​​ソッドを呼び出すかを選択できますis_post?(arg)itemがオブジェクトでない限りKernel、そのメソッドis_post?を定義していません。

メソッドは引数を 1 つだけ取ります。item にis_post?メソッドがある場合item.is_post?、 を実行すると、引数は提供されず、メソッドにのみ提供されselfます。

ソリューション

おそらく交換する必要があります

item.is_post?

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

を呼び出したくありません(エラーメッセージにあるようなものです)is_post?。欲しいものは次のとおりです。itemHash

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