我是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()函数下定义它们
再次感谢所有回复的人。
答案 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