【问题标题】:Method call before method in Ruby?Ruby中方法之前的方法调用?
【发布时间】:2015-09-17 23:53:24
【问题描述】:

我是 Ruby 新手,我看到的方法定义如下:

def method_one
  puts "method 1"
end

class MyClass
  method_one
  def method_two
    puts "method 2"
  end
end

method_one 的使用方式让我想起了 Python 装饰器。

c = MyClass.new
c.method_two

方法一

方法二

我一直在尝试在网络上的 Ruby 文档中搜索有关此语法/语言功能的更多信息,但我不知道要搜索哪些关键字。

这东西叫什么?

【问题讨论】:

  • 您能否发布一个使用此语法的代码示例(有用或有效的代码)?我想不出这适用的情况。
  • @Tommyixi 我在浏览 ruby​​ 论坛时发现了这个ruby-forum.com/topic/97315
  • 我不同意发布代码的方式; “方法 1”字符串(在您的示例中)只会在课程完成后执行。
  • 我能想到的最接近的就是Ruby的initialize方法,你可以在对象初始化的时候调用任意一行代码。

标签: ruby


【解决方案1】:

TL;DR

此代码并没有按照您的想法执行。不要做这样的事情。

Ruby 的顶级对象

Ruby 允许您在类之外定义方法。这些方法存在于顶级对象上,您可以(通常)将其视为一种包罗万象的命名空间。您可以查看What is the Ruby Top-Level? 等各种帖子了解更多详细信息,但您不必真正关心。

在您原来的帖子中,method_one 只是顶层定义的方法。因此它可用于嵌套在顶层中的类和方法,例如 MyClass。

类中的方法

不管你怎么想,以下实际上并没有在 MyClass 上声明一个 :method_one 类或实例方法:

class MyClass
  method_one
  def method_two; end
end

相反,Ruby 在类的定义期间调用顶级::method_one,但它永远不会成为类方法(例如MyClass::method_one)或实例方法(例如MyClass.new.method_one )。这样做可能有一些用例(例如打印调试信息、测试注入等),但它令人困惑、容易出错,并且通常应该避免,除非你有一个非常强大的用例。

更好的选择

一般来说,当您在学术课程之外看到这样的事情时,程序员可能打算执行以下操作之一:

  1. 扩展课程。
  2. 向类中添加单例方法。
  3. 在类中包含一个模块。
  4. 在类定义期间设置闭包。

最后进入元编程的模糊领域,此时您可能应该考虑更新您的类初始化程序,或者传递 Proc 或 lambda 对象。 Ruby允许你做各种奇怪而美妙的事情,但这并不意味着你应该

【讨论】:

    【解决方案2】:

    我认为你有点误导;输出:

    c = MyClass.new
    c.method_two
    

    #<MyClass:0x007feda41acf18>
    "method 2"
    

    在加载类之前,您不会看到方法一,或者如果您在 IRB 中,则输入最后一个 end 语句。

    我建议研究一下 ruby​​ 的初始化方法。

    【讨论】:

    • 是的,我在 irb 上试过这个,结果是一样的。但是我运行它的方法是将它保存在一个 rb 文件中并运行 ruby file.rb
    • 这是因为类正在加载,有一次,当文件被加载时。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多