唯一重要的时间方法顺序是纯程序代码,这通常是短视的,给定两种方法:
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
beforerandom_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
被调用之前定义的。同样,通过包装类,这使生活更轻松、更清洁,并意味着事物保持封装状态。