在C中是否存在像Ruby这样的“主要”方法?

时间:2012-03-13 15:31:28

标签: ruby main-method

我是Ruby的新手,如果听起来真的很傻,那就道歉了。

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

我发现了以下SO帖子,但我不明白: Should I define a main method in my ruby scripts?

虽然这不是什么大问题,但能够更容易地在同一个文件中查看所有相关代码。谢谢。

[ - 编辑 - ]

感谢所有回复的人 - 结果证明你只需要定义代码上方的所有方法。一个例子如下:

def callTest1
    puts "in test 1"
end

def callTest2
    puts "in test 2" 
end

callTest1
callTest2

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

再次感谢所有回复的人。

6 个答案:

答案 0 :(得分:37)

@Houleth的回答是正确的:Ruby中没有main方法或结构。我只想提供一个稍微不同的视图以及一些解释。

执行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是一本很好的读物:)

答案 1 :(得分:22)

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

puts 'Hello World'

您提到的问题是将一个文件用作模块和可执行文件,因此如果您编写

if __FILE__ == $0
  # your code
end

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

答案 2 :(得分:6)

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

class Foo
  p self
end
#=> Foo

p self
#=> main

def foo 
  p self
end
foo
#=> main

答案 3 :(得分:1)

Ruby中没有神奇的主要功能。见http://en.wikipedia.org/wiki/Main_function#Ruby

答案 4 :(得分:1)

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

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

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

答案 5 :(得分: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