【问题标题】:Do methods have to be always inside classes in Ruby?方法必须始终在 Ruby 的类中吗?
【发布时间】:2020-07-21 18:36:41
【问题描述】:

大家好,我是 Ruby 新手。我有一个问题:方法必须总是在类中吗?

【问题讨论】:

  • @greenhunt2003 :你总是在某个类,即使你没有明确定义一个。你可以通过运行ruby -e 'puts self.class'来看到这一点。
  • @user1934428 吹毛求疵,但是:你总是在一个对象的上下文中。该对象不必是一个类。 (mainObject 的一个实例,而不是Class
  • @Stefan:绝对正确!感谢您指出。如果我们明确地add a method to an instance of some class,这同样适用。
  • @Stefan:更多吹毛求疵:Ruby 中有 三个 不同的隐式上下文。对于方法lookup(以及其他一些东西,例如ivar 查找),您确实总是处于object 的上下文中。但就方法定义而言,您始终处于模块的上下文中。并且对于常量查找的目的,您始终处于……无论您想调用什么常量被查找的上下文。当然,还有局部变量查找,您始终处于 词法范围.
  • @JörgWMittag:阅读您的 cmets 总是很愉快。你有没有想过写一本书,特别是一本 Ruby 书?

标签: ruby programming-languages


【解决方案1】:

从技术上讲,它们是在一个类中定义的,但这并不意味着您总是需要打开一个类来定义一个方法。

以下是其他语言中的顶级函数:

def foo
  puts self
  puts self.class
end

如果我们简单地调用foo,我们会得到:

main
Object

这实际上在Object 类中定义了一个私有实例方法。我们看到顶级作用域中的self 是一个特殊的对象,叫做main


另一方面,我们可以尝试在其他东西上调用这个方法:

'bar'.foo #!> private method `foo' called for "bar":String (NoMethodError)

此错误显示为 foo 是私有的。我们可以使用一个叫做send的特殊方法来调用私有方法:

'bar'.send :foo

得到我们:

bar
String

我们也可以在所谓的单例类中定义方法。您可以将它们视为只有一个实例的类。例如:

foo = 'foo'

def foo.bar
  puts 'baz'
end

foo.bar    # => baz
'quix'.bar # !> undefined method `bar' for "quix":String
'foo'.bar  # !> undefined method `bar' for "foo":String

puts (foo.singleton_class.instance_methods - Object.instance_methods).first
  # => bar

这里的bar 方法是在foo 的单例类上定义的。请注意,即使另一个具有相同内容的字符串仍然是差异实例,因此它没有 bar 方法。

【讨论】:

  • 一个更常见的例子是一个类方法,例如def String.foo - 它也只是在类的单例类中创建的一个实例方法。
  • @Stefan 是的,这是最好的例子,它还说 Ruby 中没有像其他语言那样真正的类方法,因为它总是绑定到一个对象。
  • ruby-doc.org/core-2.7.1/Kernel.html#method-i-puts 没有在类中定义。请参阅 Jörg 的回答。
【解决方案2】:

大家好,我是 Ruby 新手。我有一个问题:方法必须总是在类中吗?

没有。

方法必须始终在模块中。 (类也是模块。)

例子:

module Foo
  def bar; end
end

这里没有课。

【讨论】:

  • 天哪,我完全忘记了模块 :-)
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多