2014-10-20 69 views
2

我想了解爲什麼這兩個東西會返回不同的值。self.element ='this'和self.send(「element =」,'this')之間的區別

值是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。

+1

你可以在你的代碼中包含你要調用每個方法的參數嗎? – 2014-10-20 18:08:05

+2

我無法重現您描述的場景。看到這個要點:https://gist.github.com/jrunning/b9250c6d5af63192171e兩種方法都返回相同的值。 – 2014-10-20 18:14:22

+1

我很確定這兩個字節碼/ VM級別完全一樣。 – 2014-10-20 18:22:16

回答

5

不管方法的返回值如何,調用名稱以=結尾的方法的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=方法有一個返回值是不是該參數的方法。

+0

「這不是當你使用'send'來調用該方法。」 爲什麼? – 2014-10-20 18:40:03

+0

「爲什麼」的答案是「因爲它是如何編程的」。 :)我不確定Matz等人爲什麼這樣做,但對我來說這很有意義,所以這就是爲什麼** I **會像Ruby這樣的編程語言做到這一點:(1)Ruby允許鏈接值到局部變量,比如'a = b = c = 17'。如果'a = b.c = d = 17'將'd'設置爲'17',而將'a'設置爲別的,這會有點奇怪。 (2)但另一方面,僅僅因爲一個方法以'='結尾,我不想正常改變返回值。調用沒有語法糖的方法我想有一個正常的返回值。 – Phrogz 2014-10-20 18:44:02

+0

爲什麼呢?賦值總是評估到右側,方法調用總是評估爲方法的返回值。這是一個非常簡單的規則。爲什麼不必要地使它複雜化? – 2014-10-20 23:16:42

-1

Self.Send允許您動態選擇您的對象,而不管其類型。 這可以讓你用非常簡單的代碼來驅動你的測試。

+0

我不認爲這回答了這個問題。問題是爲什麼兩種類似的方法返回不同的值。提問者已經理解了'self.send'的用途。 – 2015-05-29 14:57:56

相關問題