【问题标题】:Is there a "main" method in Ruby like in C?Ruby 中是否有像 C 中一样的“主要”方法?
【发布时间】:2023-03-21 21:40:01
【问题描述】:

我是 Ruby 新手,如果这听起来很愚蠢,请道歉。

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

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

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

[-EDIT-]

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

def callTest1
    puts "in test 1"
end

def callTest2
    puts "in test 2" 
end

callTest1
callTest2

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

再次感谢所有回复的人。

【问题讨论】:

  • 你的答案在我看来比其他人好,你为什么不把它作为答案发布并接受它(这比编辑更好)

标签: ruby main-method


【解决方案1】:

@Hauleth 的回答是正确的: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

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

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 中的顶级作用域是一个名为mainObject。不过,它的行为有点古怪:

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

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

【讨论】:

    【解决方案2】:

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

    puts 'Hello World'
    

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

    if __FILE__ == $0
      # your code
    end
    

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

    【讨论】:

    【解决方案3】:

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

    class Foo
      p self
    end
    #=> Foo
    
    p self
    #=> main
    
    def foo 
      p self
    end
    foo
    #=> main
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 完全错过了这个链接。谢谢。
      【解决方案5】:

      如果您希望运行 Ruby 脚本(如 C 编译文件),请执行以下操作:

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

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

      【讨论】:

        【解决方案6】:

        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
        
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-03
          • 2010-10-21
          • 1970-01-01
          • 2023-03-04
          相关资源
          最近更新 更多