Ruby中object.method(a,b)和method(a,b)有啥区别

Posted

技术标签:

【中文标题】Ruby中object.method(a,b)和method(a,b)有啥区别【英文标题】:What is the difference between object.method(a,b) and method(a,b) in RubyRuby中object.method(a,b)和method(a,b)有什么区别 【发布时间】:2014-09-14 22:11:53 【问题描述】:

我对编程非常陌生,并且正在尝试学习 Ruby。目前我无法完全理解方法。我明白:

方法允许我执行一段代码而不必重写它,这样的方法看起来像:

example_method

参数允许我将值传递到方法中的代码中,以代替方法中定义的占位符。这样我就可以执行一组具有不同输入的代码。带参数的方法如下所示:

example_method( x , y )

但是我对对象上的方法的实例化实际上在做什么感到困惑。例如:

object.example_method( x, y )

这是什么意思?为什么将方法附加到带有句点符号的对象上?我们这样做是为了在我们的方法中引用对象的 Instance / Class variables 吗?还有其他理由这样做吗?

例如如果:

def example_method(x , y)
  x * y
end

object.exaple_method(a , b) 会和example_method(a , b) 一样吗?

感谢您的帮助,如果我不清楚,请见谅。

【问题讨论】:

记得编辑您的帖子并正确格式化代码。 【参考方案1】:

Ruby 是一种Object Oriented 语言。这意味着对象不仅有成员(=state),也有方法(=behavior)。当您在对象上调用方法时(在这种情况下,对象被称为调用者),运行的方法是对应于此对象的类型行为的方法。

当您调用没有调用者的方法时,self 隐含地是调用者。在 irb 中,self 被视为 main,或全局范围。

例子:

def my_method(a)
  "#a from main"
end

class A
  def my_method(a)
    "#a from A"
  end
end

class B
  def my_method(a)
    "#a from B"
  end
end

a = A.new
b = B.new

my_method(1)
# => "1 from main"
a.my_method(1)
# => "1 from A"
b.my_method(1)
# => "1 from B"

【讨论】:

谢谢!现在开始点击。如果调用者没有 Local Scope 方法,它会继承 Global Scope 方法吗? @Cu1ture 尝试调用对象类型中不存在的对象的方法将导致undefined method 错误 感谢回复,当调用没有Caller的方法时,程序的全部内容是否被视为该方法正在调用的对象? @Cu1ture - 这取决于您从哪里调用它。如果您从within 一个对象(在其方法之一中)调用它 - 对象本身被认为是调用者。如果它是在全局作用域本身上调用的,那么是的,全局作用域本身就是一个对象。 有道理!谢谢 Uri,你真的帮我解决了这个问题。现在尝试理解类方法:)【参考方案2】:

如果我正确地假设您的要求是类方法与实例方法

def Object
  def self.example_method(x, y)
    #this is a class method
    x * y
  end

  def example_method(x,y)
    #this is an instance method
    x * y
  end
end

所以现在我们已经定义了它们,这就是我们如何称呼它们

#This called the class method
Object.example_method(3,3) => 9

#To call the instance method we have to have an instance
object = Object.new
object.example_method(3,3) => 9

【讨论】:

感谢回复,更多的是我不明白对象上调用的方法和对象上不调用的方法的区别。 @Cu1ture:总是在对象上调用方法。如果您没有明确指定接收者,则接收者隐含为self

以上是关于Ruby中object.method(a,b)和method(a,b)有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

按子数组总和大小 Ruby 拆分子数组数组

ruby

python 怎样调用基类函数

Ruby注入初始为哈希

Ruby 中的语法 [*a..b] 是啥意思?

当a = b时,Ruby不会创建b的重复变量a吗? [复制]