8

我是红宝石的新手。我熟悉其他几种语言。我的问题是关于无序调用方法。例如:

def myfunction
    myfunction2
end

def myfunction2
    puts "in 2"
end

在声明 myfunction2 之前如何调用它?几种语言允许您在顶部或 .h 文件中声明它。红宝石如何处理它?

我是否总是需要遵循这个:

def myfunction2
    puts "in 2"
end

def myfunction
    myfunction2
end

主要是当我需要def initialize为一个类调用另一个方法时,这让我很烦恼。

4

4 回答 4

20

在定义方法之前不能调用它。但是,这并不意味着您不能定义myfunctionbefore myfunction2!Ruby 具有后期绑定,因此在调用之前对myfunction2in的调用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

唯一重要的时间方法顺序是纯程序代码,这通常是短视的,给定两种方法:

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

这可以正常工作,除非你想使用greetbeforerandom_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 回答