如何在Ruby中处理方法顺序?

如何在Ruby中处理方法顺序?,ruby,Ruby,我对Ruby是新手。我熟悉其他几种语言。我的问题是关于调用无序的方法。例如: def myfunction myfunction2 end def myfunction2 puts "in 2" end 如何在声明myfunction2之前调用它?有几种语言允许您在顶部或.h文件中声明它。ruby是如何处理的 我是否始终需要遵循以下步骤: def myfunction2 puts "in 2" end def myfunction myfunction2 e

我对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
中的另一个方法时,这会让我感到不舒服。

您可以按任何顺序定义方法,顺序无关紧要。

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
此外,例如,如果函数调用不存在的函数,则只有在调用该函数时才会调用运行时异常,即。e、 :

[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
,而Ruby对此很好,只有在我调用
foo
时才会引发异常。唯一的时间方法顺序问题是在纯过程代码中,这通常是短视的,因为有两种方法:

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
这就行了,除非您想在定义
随机问候语
之前使用
问候语
,否则所有非平凡代码解决这一问题的方法是将行为包装在一个类中:

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个方法,因此最好将自己的方法放入表示项目模型中的参与者或对象的类中

除了您在问题中所说的初始化类之外,这是完全可能的:

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

尽管在编写
initailize
时没有定义方法
random\u greeting
,但是在调用
initialize
之前定义了整个类。同样,通过包装类,这使生活更简单、更干净,意味着事情不会改变。

在定义方法之前不能调用它。但是,这并不意味着您不能在
myfunction2
之前定义
myfunction
!Ruby具有后期绑定,因此在调用
myfunction
之前,在
myfunction
中调用
myfunction2
不会与实际的
myfunction2
相关联。这意味着,只要在声明了
myfunction2
之后完成了对
myfunction
的第一次调用,您就可以了

所以,这没关系:

这不是:


注意:可以通过添加
BEGIN
语句将非工作示例输入工作代码:
BEGIN{def myfunction2;put“in 2”;end}
@steenslag一个更好的方法是添加
end
语句:
end{myfunction}
def myfunction
    myfunction2
end

def myfunction2
    puts "in 2"
end

myfunction
def myfunction
    myfunction2
end

myfunction

def myfunction2
    puts "in 2"
end