メソッドの順序が問題になるのは純粋に手続き型のコードのみであり、次の 2 つのメソッドを考えると、通常は近視眼的です。
def greet
puts "%s, Dave" % random_greeting
end
# If I try to use `greet` here, it'll raise a NoMethodError
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
# I can use `greet` here, because `random_greeting` is now defiend
greet
が定義される前に使用したい場合を除き、これは問題なく機能します。random_greeting
すべての非自明なコードがこれを解決する方法は、クラスで動作をラップすることです。
class Doorman
def greet
puts "%s, Dave" % random_greeting
end
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
end
Doorman.new.greet
クラスで動作をラップすることにより、アプリケーションをより適切にモデル化できます (たとえば、ホテルDoorman.new.greet
コード内の異なるオブジェクトは異なる挨拶をする可能性があります)。また、名前空間をきれいに保ちます。main
Rubyのmain
オブジェクトには既に 114 個のメソッドが定義されているため、プロジェクトのモデル内のアクターまたはオブジェクトを表すクラスに独自のメソッドを配置することをお勧めします。
in initialize of a classに関する質問であなたが言ったことに加えて、これは完全に可能です:
class Doorman
def initialize
puts "%s, I'm a new Doorman instance" & random_greeting
end
def greet
"%s, Dave" % random_greeting
end
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
end
random_greeting
を書くときにメソッドが定義されていなくても、initailize
クラス全体がinitialize
呼び出される前に定義されています。繰り返しになりますが、クラスをラップすることで、作業がより簡単でクリーンになり、物事がカプセル化されたままになります。