43

我是 Ruby 的新手,如果这听起来很愚蠢,我深表歉意。

我似乎无法弄清楚如何编写“主”代码并将方法放在同一个文件中(类似于 C)。我最终得到了一个“主”文件,它加载了一个包含所有方法的单独文件。我很感激这方面的任何指导。

我发现了以下 SO 帖子,但我不明白: 我应该在我的 ruby​​ 脚本中定义一个主要方法吗?

虽然这没什么大不了的,但在同一个文件中查看所有相关代码会更容易。谢谢你。

[-编辑-]

感谢所有回复的人 - 原来您只需要在代码上方定义所有方法。下面是一个例子:

def callTest1
    puts "in test 1"
end

def callTest2
    puts "in test 2" 
end

callTest1
callTest2

我认为这是有道理的,因为 Ruby 需要事先了解所有方法。这与 C 不同,其中有一个头文件清楚地列出了可用函数,因此可以在 main() 函数下定义它们

再次感谢所有回复的人。

4

6 回答 6

42

@Hauleth 的回答是正确的:mainRuby 中没有方法或结构。我只想在这里提供一个稍微不同的观点以及一些解释。

当您执行时ruby somefile.rb,Ruby 会执行somefile.rb. 因此,如果您有一个非常小的项目并希望它独立于单个文件中,那么执行以下操作绝对没有错:

# somefile.rb

class MyClass
  def say_hello
    puts "Hello World"
  end
end

def another_hello
  puts "Hello World (from a method)"
end

c = MyClass.new
c.say_hello
another_hello

并不是前两个块没有执行,只是在实际使用相应的类/方法之前,您看不到效果。

if __FILE__ == $0位只是一种阻止您只想在此文件直接从命令行运行时运行的代码的方法。 __FILE__ 是当前文件的名称,$0是由 shell 执行的命令(尽管它足够聪明,可以删除ruby),因此比较两者可以准确地告诉您:这是从命令行执行的文件吗?这有时是由想要在文件中定义类/模块并提供使用它的命令行实用程序的编码人员完成的。恕我直言,这不是很好的项目结构,但就像任何用例一样,这样做非常有意义。

如果您希望能够直接执行您的代码,您可以添加一个shebang

#!/usr/bin/env ruby

# rest of somefile.rb

并使其可执行chmod +x somefile.rb(可选地在不带 .rb 扩展名的情况下重命名)。这并没有真正改变你的情况。仍然有效,if __FILE__ == $0但可能仍然没有必要。

编辑

正如@steenslag 正确指出的那样,Ruby 中的顶级范围是被Object调用的main. 不过,它的行为有点古怪:

irb
>> self
=> main
>> self.class
=> Object
>> main
NameError: undefined local variable or method `main' for main:Object
from (irb):8

在您开始更深入地研究该语言之前,请不要担心这一点。如果您确实想了解更多关于这类东西的信息,Metaprogramming Ruby是一本不错的读物:)

于 2012-03-13T16:16:46.673 回答
28

不,没有这样的结构。当然,您可以定义 main 函数,但在您这样做之前不会调用它。Ruby 逐行执行,所以如果你想打印“Hello World”,你只需写:

puts 'Hello World'

你提到的问题是关于使用一个文件作为模块和可执行文件,所以如果你写

if __FILE__ == $0
  # your code
end

仅当您运行此文件时才会调用它。如果您只在其他文件中需要它,那么此代码将永远不会运行。但恕我直言,这是个坏主意,更好的选择是使用 RubyGems 并在那里添加可执行文件。

于 2012-03-13T15:38:27.543 回答
6

实际上有一个main,但它不是一个方法;它是顶级对象,是 Ruby 程序的初始执行上下文。

class Foo
  p self
end
#=> Foo

p self
#=> main

def foo 
  p self
end
foo
#=> main
于 2012-03-13T21:07:16.067 回答
1

Ruby 中没有神奇的 main 函数。见http://en.wikipedia.org/wiki/Main_function#Ruby

于 2012-03-13T15:38:56.190 回答
1

如果您希望运行像 C 编译文件这样的 Ruby 脚本,请执行以下操作:

#!/usr/bin/env ruby
puts "Hello"

然后chmod a+x file_name.rb。第一行以下的所有内容都将运行,就好像它是mainC 中的内容一样。当然,类和函数定义在实例化/调用之前不会给您任何结果(尽管实际上对类定义中的代码进行了评估,所以你可以获得一些输出,但在正常情况下这是不期望的)。

于 2012-03-13T16:11:56.200 回答
0

编写 main() 方法的另一种方法是:

class HelloWorld
    def initialize(name)
        @name = name
    end

    def sayHello()
        print "Hello #@name!"
    end
end

def main()
    helloWorld = HelloWorld.new("Alice")
    helloWorld.sayHello
end

main


于 2021-05-17T06:15:06.210 回答