用equals定义Ruby中的方法

Aar*_*ver 11 ruby syntax

作为Ruby的新手,我无法向自己解释 Ruby中方法定义的行为.

下面举例说明......

class Foo
  def do_something(action)
    action.inspect
  end
  def do_something_else=action 
    action.inspect
  end
end

?> f.do_something("drive")
=> "\"drive\""

?> f.do_something_else=("drive")
=> "drive"
Run Code Online (Sandbox Code Playgroud)

第一个例子是自我解释的.我试图理解的是第二个例子的行为.除了看起来是一个产生字符串文字,而另一个不是,实际发生了什么?为什么我会使用一个而不是另一个?

Eri*_*son 14

通常,do_something是一个吸气剂,并且do_something=是一个设定者.

class Foo
  attr_accessor :bar
end
Run Code Online (Sandbox Code Playgroud)

相当于

class Foo
  def bar
    @bar
  end

  def bar=(value)
    @bar = value
  end
end
Run Code Online (Sandbox Code Playgroud)

要回答关于行为差异的问题,结束的方法=总是返回表达式的右侧.在这种情况下返回action,而不是action.inspect.

class Foo
  def do_something=(action)
    "stop"
  end
end

?> f = Foo.new
?> f.do_something=("drive")
=> "drive"
Run Code Online (Sandbox Code Playgroud)

  • 我知道我在这里参加聚会有点晚了,但是这个答案并不完全正确。`do_something=` _method_ 的 _return value_ 正是它看起来应该是的样子,也就是说,`"stop"`。您可以通过调用 `f.send(:do_something=,"drive")` 来验证这一点,返回值将是 `"stop"`。然而,`f.do_something = "drive"`,作为一个_表达式_,_evaluates_为`"drive"`,不管方法的_return value_。换句话说,它不是 setter 方法的返回值,也不是赋值表达式的计算,总是解析到表达式的右侧。 (2认同)

Rya*_*igg 10

您的两个方法实际上都被定义并称为方法.相当多的Ruby的东西都可以被定义为方法,即使是运营商,如+,-,*/.Ruby允许方法有三个特殊的符号后缀.我自己完成了这个短语.我的意思是符号后缀是方法结尾处的东西将指示该方法应该如何工作.

砰!

第一个符号后缀!.这表明该方法应该是破坏性的,这意味着它修改了它被调用的对象.比较这两个脚本的输出:

a = [1, 2, 3]
a.map { |x| x * x }
a
Run Code Online (Sandbox Code Playgroud)

和:

a = [1, 2, 3]
a.map! { |x| x * x }
a
Run Code Online (Sandbox Code Playgroud)

两个脚本之间存在一个字符差异,但它们的运行方式不同!第一个仍将遍历数组中的每个元素并在块内执行操作,但是对象a仍然与[1,2,3]您开始时的相同.

然而,在第二个例子中,a最后将是[1, 4, 9]因为map!修改了对象!

询问

第二记法后缀?,和指示的方法被用于查询有关的东西的对象,并且意味着该方法应该返回true,false或在一些极端的情况下,nil.

现在,请注意该方法不必返回truefalse...它只是如果它那样它会非常好!

证明:

def a?
  true
end

def b?
  "moo"
end
Run Code Online (Sandbox Code Playgroud)

呼叫a?将返回true,呼叫b?将返回"moo".那就是那个查询方法.应该返回true或者false有时可以返回其他东西的方法,因为一些开发人员不喜欢其他开发人员.

塞特斯!

现在我们得到你的(释义)问题:在一个方法结束时意味着什么=

这通常表明一个方法将设置一个特定的值,正如Erik在我完成这篇答案的文章之前已经概述的那样.

但是,它可能不会设置一个,就像查询方法可能不会返回truefalse.这只是惯例.

您也可以像这样调用setter方法:

foo.something_else="value"
Run Code Online (Sandbox Code Playgroud)

或者(我最喜欢的):

foo.something_else = "value"
Run Code Online (Sandbox Code Playgroud)

从理论上讲,您实际上可以忽略传入的值,就像您可以完全忽略传递给任何方法的任何参数一样:

def foo?(*args)
  "moo"
end

>> foo?(:please, :oh, :please, :why, :"won't", :you, :use, :these, :arguments, :i, :got, :just, :for, :you, :question_mark?)
=> "moo"
Run Code Online (Sandbox Code Playgroud)

Ruby支持setter方法的所有三种语法,尽管很少见到你使用过的方法!

好吧,我希望这个答案大致具有教育意义,现在你对Ruby的了解更多.请享用!