【问题标题】:Difference between self.element = 'this' and self.send("element=", 'this')self.element = 'this' 和 self.send("element=", 'this') 的区别
【发布时间】:2014-10-20 18:04:25
【问题描述】:

我试图理解为什么这两个东西返回不同的值。

值是string,字段是text_field

def populate_text(field, value)
  self.send "user_name=", value
end
# => nil

def populate_text(value)
  self.user_name = value
end
# => "value"

为什么selfsend 有不同的返回值?

如果有帮助,此类包括 PageObject。

【问题讨论】:

  • 你能在你的代码中包含你调用每个方法的参数吗?
  • 我无法重现您描述的场景。请参阅此要点:gist.github.com/jrunning/b9250c6d5af63192171e 两种方法都返回相同的值。
  • 我很确定这两个在字节码/虚拟机级别是完全相同的。
  • 它一定是特定于环境的,因为它为我返回了两个不同的值。我也在使用页面对象。
  • 你为什么要写self.self "user_name=", value 而不是self.user_name = valuesend 主要在您的字段名称是动态的时有用。

标签: ruby page-object-gem


【解决方案1】:

Ruby 用于调用名称以 = 结尾的方法的语法糖总是返回右手边的值,而不管方法的返回值如何。

当您使用send 调用该方法时,情况并非如此。例如:

class Foo
  def bar=(n)
    :ohno
  end
end

f = Foo.new
x = (f.bar = 42)
y = f.send("bar=", 42)
p [x,y]
#=> [42, :ohno]

因此,如果您的 user_name= 方法的返回值不是该方法的参数,您将获得两个不同的值。

【讨论】:

  • "当您使用send 调用该方法时,情况并非如此。"为什么?
  • “为什么”的答案是“因为它就是这样编程的”。 :) 我不确定为什么 Matz 等人会这样做,但这对我来说很有意义,所以这就是为什么 I 会有像 Ruby 这样的编程语言这样做:(1) Ruby允许将值链接到局部变量,例如a = b = c = 17。如果a = b.c = d = 17d 设置为17 而将a 设置为其他值,那就有点奇怪了。 (2) 但另一方面,仅仅因为一个方法被命名为以= 结尾,我不想正常更改返回值。调用没有语法糖的方法我希望有一个正常的返回值。
  • 为什么会这样?赋值总是计算在右边,方法调用总是计算方法的返回值。这是一个非常简单的规则。为什么不必要地复杂化?
【解决方案2】:

Self.Send 允许您动态选择对象,而不管其类型如何。 这让您可以使用非常简单的代码来驱动测试。

【讨论】:

  • 我认为这不能回答问题。问题是为什么两种类似的方法会返回不同的值。提问者已经明白self.send 的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2010-11-06
  • 2011-04-12
  • 2013-10-23
  • 1970-01-01
相关资源
最近更新 更多