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

rch*_*chn 40 ruby main-method

我是Ruby的新手,如果听起来真的很傻,那么道歉.

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

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

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

[-编辑-]

感谢所有回复的人 - 事实证明,您只需要定义代码上方的所有方法.一个例子如下:

def callTest1
    puts "in test 1"
end

def callTest2
    puts "in test 2" 
end

callTest1
callTest2
Run Code Online (Sandbox Code Playgroud)

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

再次感谢所有回复的人.

dan*_*ain 41

@Houleth的回答是正确的: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
Run Code Online (Sandbox Code Playgroud)

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

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

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

#!/usr/bin/env ruby

# rest of somefile.rb
Run Code Online (Sandbox Code Playgroud)

并使其可执行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
Run Code Online (Sandbox Code Playgroud)

在你开始深入研究语言之前,不要担心这一点.如果你想学到很多更多的这种东西,元编程红宝石是一个伟大的阅读:)


Hau*_*eth 23

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

puts 'Hello World'
Run Code Online (Sandbox Code Playgroud)

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

if __FILE__ == $0
  # your code
end
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你想坚持 `rubocop` 风格指南,推荐的方法是 `$PROGRAM_NAME == __FILE__`(所以用 `$PROGRAM_NAME` 替换 `$0` 并用右操作数反转左边)。更多信息可在此处获得 https://github.com/github/rubocop-github/blob/master/STYLEGUIDE.md (2认同)

ste*_*lag 6

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

class Foo
  p self
end
#=> Foo

p self
#=> main

def foo 
  p self
end
foo
#=> main
Run Code Online (Sandbox Code Playgroud)