如何在Ruby中处理方法顺序?
我对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
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