8

私はRubyが初めてです。私は他のいくつかの言語に精通しています。私の質問は、メソッドの呼び出しについてです。例えば:

def myfunction
    myfunction2
end

def myfunction2
    puts "in 2"
end

宣言される前に myfunction2 を呼び出すにはどうすればよいですか? いくつかの言語では、先頭または .h ファイルで宣言できます。Rubyはそれをどのように処理しますか?

常にこれに従う必要がありますか:

def myfunction2
    puts "in 2"
end

def myfunction
    myfunction2
end

def initialize主に、クラスの内部で別のメソッドを呼び出す必要がある場合、これは私を悩ませます。

4

4 に答える 4

20

定義する前にメソッドを呼び出すことはできません。myfunctionただし、それはbefore myfunction2!を定義できないという意味ではありません。Ruby には遅延バインディングがあるため、 in への呼び出しは、myfunction2を呼び出す前にmyfunction実際に関連付けられません。つまり、が宣言された後に最初の呼び出しが行われる限り、問題はありません。myfunction2myfunctionmyfunction myfunction2

だから、これは大丈夫です:

def myfunction
    myfunction2
end

def myfunction2
    puts "in 2"
end

myfunction

これはそうではありません:

def myfunction
    myfunction2
end

myfunction

def myfunction2
    puts "in 2"
end
于 2012-05-21T07:27:43.473 に答える
7

メソッドの順序が問題になるのは純粋に手続き型のコードのみであり、次の 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呼び出される前に定義されています。繰り返しになりますが、クラスをラップすることで、作業がより簡単でクリーンになり、物事がカプセル化されたままになります。

于 2012-05-21T07:25:01.803 に答える
1

Ruby はインタープリター言語なので、関数の順序に依存しません。例:

[1] pry(main)> def myfunction
[1] pry(main)*   myfunction2    
[1] pry(main)* end  
=> nil
[2] pry(main)> 
[3] pry(main)> def myfunction2
[3] pry(main)*   puts "in 2"    
[3] pry(main)* end  
=> nil
[4] pry(main)> myfunction
in 2
=> nil

また、たとえば、関数が存在しない関数を呼び出す場合、その関数が呼び出される場合にのみ実行時例外が呼び出されます。

[5] pry(main)> def foo
[5] pry(main)*   blubry_starego_marycha
[5] pry(main)* end  
=> nil
[6] pry(main)> def boo
[6] pry(main)*   "bom bom bom"
[6] pry(main)* end  
=> nil
[7] pry(main)> boo
=> "bom bom bom"
[8] pry(main)> foo
NameError: undefined local variable or method `blubry_starego_marycha' for main:Object
from (pry):9:in `foo'

fooご覧のとおり、存在しない関数を呼び出す関数を宣言しましたがblubry_starego_marycha、Ruby はそれで問題なく、呼び出した場合にのみ例外を発生させますfoo

于 2012-05-21T07:22:11.153 に答える
-1

メソッドは任意の順序で定義できますが、順序は関係ありません。

于 2012-05-21T07:17:12.853 に答える