Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:定义函数原型?_Ruby - Fatal编程技术网

Ruby:定义函数原型?

Ruby:定义函数原型?,ruby,Ruby,可以定义一个函数的原型,或者以某种方式向Ruby表明一个函数存在,即使它可能还没有被定义 我有很多这样的课程: class Program FIRST = Block.FIRST FOLLOW = Set.new['$'] end class Block FIRST = Declaration.FIRST FOLLOW = Set.new['.'] end class Declaration FIRST = ConstDecl.FIRST + VarDecl.F

可以定义一个函数的原型,或者以某种方式向Ruby表明一个函数存在,即使它可能还没有被定义

我有很多这样的课程:

class Program 
  FIRST  = Block.FIRST
  FOLLOW = Set.new['$']
end

class Block
  FIRST  = Declaration.FIRST
  FOLLOW = Set.new['.'] 
end

class Declaration
  FIRST  = ConstDecl.FIRST + VarDecl.FIRST + ProcDecl.FIRST
end

class ConstDecl
  FIRST = Set.new['const'] + EMPTY_SET
end
class Program
  def self.first;   Block.first  end
  def self.follow;  Set.new['$'] end
end

class Block
  def self.first;   Declaration.first end
  def self.follow;  Set.new['.']      end
end

class Declaration
  def self.first;   ConstDecl.first + VarDecl.first + ProcDecl.first end
end

class ConstDecl
  def self.first;   Set.new['const'] + EMPTY_SET end
end

从下面定义的类中可以看到哪些引用字段,有没有一种方法可以向Ruby指出这些类存在,并让Ruby查找它们?

我能想到的最简单的方法是这样的:

class Program 
  FIRST  = Block.FIRST
  FOLLOW = Set.new['$']
end

class Block
  FIRST  = Declaration.FIRST
  FOLLOW = Set.new['.'] 
end

class Declaration
  FIRST  = ConstDecl.FIRST + VarDecl.FIRST + ProcDecl.FIRST
end

class ConstDecl
  FIRST = Set.new['const'] + EMPTY_SET
end
class Program
  def self.first;   Block.first  end
  def self.follow;  Set.new['$'] end
end

class Block
  def self.first;   Declaration.first end
  def self.follow;  Set.new['.']      end
end

class Declaration
  def self.first;   ConstDecl.first + VarDecl.first + ProcDecl.first end
end

class ConstDecl
  def self.first;   Set.new['const'] + EMPTY_SET end
end

不过,对我来说,这似乎不是一个好的设计,我可能会创建这些对象而不是类,并使用适当的类型层次结构。

我能想到的最简单的方法是这样的:

class Program 
  FIRST  = Block.FIRST
  FOLLOW = Set.new['$']
end

class Block
  FIRST  = Declaration.FIRST
  FOLLOW = Set.new['.'] 
end

class Declaration
  FIRST  = ConstDecl.FIRST + VarDecl.FIRST + ProcDecl.FIRST
end

class ConstDecl
  FIRST = Set.new['const'] + EMPTY_SET
end
class Program
  def self.first;   Block.first  end
  def self.follow;  Set.new['$'] end
end

class Block
  def self.first;   Declaration.first end
  def self.follow;  Set.new['.']      end
end

class Declaration
  def self.first;   ConstDecl.first + VarDecl.first + ProcDecl.first end
end

class ConstDecl
  def self.first;   Set.new['const'] + EMPTY_SET end
end

不过,对我来说,这似乎不是一个好的设计,我可能会创建这些对象而不是类,并使用适当的类型层次结构。

您可以尝试
定义?(函数名)

您可以尝试
定义?(函数名)
Ruby和您可能习惯的其他语言(如C/C++)之间的一个主要区别就是说,在执行之前,C/C++程序由编译器进行处理,编译器将变量/函数的使用与其定义相匹配。Ruby程序只是从上到下执行,一次执行一条语句。因此,当执行引用
Block.FIRST
的行时,Ruby解释器无法在程序代码中“向前看”并查看将分配给
Block.FIRST
的值。它不知道以后会发生什么;它只知道到目前为止执行了什么

也许Ruby最强大的特性之一是,几乎所有东西都是动态的,可以在运行时更改。如果您来自C/C++背景,这是您理解Ruby所需要的第一件事。例如,Ruby中的常量可以有条件地分配:

class Block
  if rand % 2 == 0
    FIRST = '.'
  else
    FIRST = '$'
  end
end
如果Ruby解释器被要求“向前看”以查看Block.FIRST的值应该是多少,那么在上述情况下它应该预测什么

这是一种观念上的转变,它要求你以不同的方式构建你的程序,并以不同的方式思考你的程序。如果你试图用Ruby编写C/C++/Java,你将一路奋战


在这种情况下,我建议您简单地颠倒定义的顺序,然后“自下而上”。有其他方法可以达到同样的效果,但这是最简单的方法。

Ruby与您可能习惯的其他语言(如C/C++)之间的主要区别在于,在执行之前,C/C++程序由编译器处理,编译器将变量/函数的使用与其定义相匹配。Ruby程序只是从上到下执行,一次执行一条语句。因此,当执行引用
Block.FIRST
的行时,Ruby解释器无法在程序代码中“向前看”并查看将分配给
Block.FIRST
的值。它不知道以后会发生什么;它只知道到目前为止执行了什么

也许Ruby最强大的特性之一是,几乎所有东西都是动态的,可以在运行时更改。如果您来自C/C++背景,这是您理解Ruby所需要的第一件事。例如,Ruby中的常量可以有条件地分配:

class Block
  if rand % 2 == 0
    FIRST = '.'
  else
    FIRST = '$'
  end
end
如果Ruby解释器被要求“向前看”以查看Block.FIRST的值应该是多少,那么在上述情况下它应该预测什么

这是一种观念上的转变,它要求你以不同的方式构建你的程序,并以不同的方式思考你的程序。如果你试图用Ruby编写C/C++/Java,你将一路奋战


在这种情况下,我建议您简单地颠倒定义的顺序,然后“自下而上”。有其他方法可以达到同样的效果,但这是最简单的方法。

您永久性地分配了不可用的值。你预计会发生什么?变量是否有薛定谔状态?在我看来,这似乎是一个设计问题,而不是编程问题。我知道默认情况下,这些值不可用,因为在解释程序中,当前执行点之后显然不存在任何内容。我想通过任何方式来说明定义如下,比如C或C++中,我可以定义函数原型。在C中,类似的东西是可能的,因为存在指针和声明的概念。在Ruby中,不存在指针和声明,所以前向声明是不可能的(也不合理)。如果您提供更多关于这些常量的上下文,我们可能会更好地帮助您。很可能你应该使用对象和方法来实现这一点,而不是类常量(它们更像是C语言的东西)。@NiklasB。基本上,首先和接下来是两个集合,我将在解析某种语言的语法时使用它们来处理错误。它们定义了您在该产品中首次遇到的符号集以及该产品之后的符号集。我希望能够全局定义它们,所以当我尝试输入错误过程时,我可以这样做:
error(“program”,program.FOLLOW)
后续集是自上而下处理的,第一集是自下而上处理的,所以如果我颠倒了第一集的编译顺序,然后,我会打乱FOLLOW set的顺序,因为您永久地分配了不可用的值。你预计会发生什么?变量是否有薛定谔状态?在我看来,这似乎是一个设计问题,而不是编程问题。我知道默认情况下,这些值不可用,因为在解释程序中,当前执行点之后显然不存在任何内容。我想用任何方式来表示定义如下,就像C或C++一样,我可以定义函数原型。