TL; DR;
Rubyのコアクラスからメソッド(どこにも書かれていない)をどのように呼び出すことができますか?Rubyコアクラス内からカスタムメソッドを呼び出す
私はテキストファイルを管理するスクリプトを作成しています。私はこの方法を導入することで、コードをクリーンアップする
File.open("file.txt", "w").each do |f|
f.puts "Text to be inserted"
f.puts text_generated
f.puts "Some other text" if some_condition?
f.puts ""
end
:ここに私のコードです
File.open("file.txt", "w").each do |f|
f.puts_content(text_generated, some_condition?
# -> Generates an error: private method called for <File> (NoMethodError)
end
def puts_content(text, cond)
puts "Text to be inserted"
puts text
puts "Some other text" if cond
puts ""
end
しかし、実際には、この方法は、理由のプライベートメソッドへのアクセスのFile
クラス内から呼び出すことはできません。
誰もがそのエラーを説明することができますか、どのようにそれを行うことができますか?
私の回避策はFile
から継承したカスタムMyFile
クラス内のこれらのメソッドを記述することです:私はFile
で直接その原料を置くことができ
MyFile.open("file.txt", "w").each do |f|
f.puts_content # Seems to work
end
class MyFile < File
def puts_content(cond)
puts "Text to be inserted"
puts text_generated_elsewhere
puts "Some other text" if cond
puts ""
end
end
、それが触れることになると私は臆病です言語コアライブラリ。
これが良い方法かどうかを知りたいのですが。
他のコアモジュール/クラスからRubyコアメソッドを呼び出すことは可能です。すべてのコアモジュール/クラスが相互に含まれているか、または相互に要求していることを意味しますか?どのようにそれはボンネットの下で動作するのですか?
こんにちは、私は精緻化について聞いたことがありません、最後には*(Btw、[こちらはドキュメントです](https://ruby-doc.org/core-2.4.2/doc/syntax/refinements_rdoc.html)バージョン(2.4.2)および詳細は実験的な機能ではありません)*。しかし、私はあなたの最初の提案が本当に好きです。全体の構造はまったく同じであり、意図は変更されません。私はそのすべてのもの(静的クラス)がどのように一緒に収まるかについてもう少し学ぶべきです。また、モジュールの使用はどうですか?私はそれが他のクラスやメソッドと "混合"する可能性のあるモジュールについて聞いたことがあります。 – SanjiBukai
メソッドをモジュールに書くことができます( 'refine File do'行なしの洗練定義と同じように見えます)。 'File.include FileUtils'でそれをインクルードしますが、基本的にFileクラスを再オープンしてメソッドを追加するのと同じことです –
ありがとうございます。それは明らかですが、静的なクラスを使用することはまだ私の好きな方法です。ありがとうございました。 – SanjiBukai