亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么Ruby設置者需要“Self”班里的資格?

為什么Ruby設置者需要“Self”班里的資格?

Cats萌萌 2019-06-11 13:44:33
為什么Ruby設置者需要“Self”班里的資格?Ruby setter-是否由(c)attr_accessor或者手動-似乎是唯一需要的方法self.在類本身內訪問時的限定條件。這似乎使Ruby單獨進入了語言世界:所有方法都需要self/this(比如Perl,我認為Javascript)不需要任何方法self/thisIS(C#,Java)只有策劃者才需要self/this(紅寶石?)最好的比較是C#與Ruby,因為兩種語言都支持語法上像類實例變量一樣工作的訪問器方法:foo.x = y, y = foo.x..C#稱它們為屬性。下面是一個簡單的例子;Ruby中的同一個程序,然后是C#:class A  def qwerty; @q; end                   # manual getter   def qwerty=(value); @q = value; end   # manual setter, but attr_accessor is same    def asdf; self.qwerty = 4; end        # "self." is necessary in ruby?   def xxx; asdf; end                    # we can invoke nonsetters w/o "self."   def dump; puts "qwerty = #{qwerty}"; endenda = A.new a.xxx a.dump拿走self.qwerty =()并且失敗了(Linux&OSX上的Ruby1.8.6)?,F在C#:using System;public class A {   public A() {}   int q;   public int qwerty {     get { return q; }     set { q = value; }   }   public void asdf() { qwerty = 4; } // C# setters work w/o "this."   public void xxx()  { asdf(); }     // are just like other methods   public void dump() { Console.WriteLine("qwerty = {0}", qwerty); }}public class Test {   public static void Main() {     A a = new A();     a.xxx();     a.dump();   }}問:這是真的嗎?除了策劃人以外,還有其他需要自我的場合嗎?也就是說,在其他情況下,Ruby方法不可能被調用無賽爾夫?當然,在很多情況下,賽爾夫成是必要的。這并不是Ruby獨有的,只是要明確一點:using System;public class A {   public A() {}   public int test { get { return 4; }}   public int useVariable() {     int test = 5;     return test;   }   public int useMethod() {     int test = 5;     return this.test;   }}public class Test {   public static void Main() {     A a = new A();     Console.WriteLine("{0}", a.useVariable()); // prints 5     Console.WriteLine("{0}", a.useMethod());   // prints 4   }}同樣的歧義是以同樣的方式解決的。但我想問的是這個案子一種方法有被定義,和不已經定義了局部變量,并且我們遇到qwerty = 4這是一個方法調用還是一個新的局部變量賦值?
查看完整描述

3 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

這里需要記住的重要一點是,Ruby方法可以在任何時候定義(Un),因此要智能地解決歧義,每個賦值都需要運行代碼來檢查在賦值時是否有指定名稱的方法。


查看完整回答
反對 回復 2019-06-11
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

我覺得這是因為qwerty = 4是模棱兩可的-您是否定義了一個名為qwerty或者打電話給策劃人?Ruby通過說它將創建一個新變量來解決這個歧義,因此self.是必需的。

這是你需要的另一個案例self.:

class A  def test    4
  end
  def use_variable
    test = 5
    test  end
  def use_method
    test = 5
    self.test  endenda = A.new
a.use_variable # returns 5a.use_method   # returns 4

如您所見,訪問test是模棱兩可的,所以self.是必需的。

這也是為什么C#示例實際上不是一個很好的比較的原因,因為使用setter定義變量的方式是明確的。如果在C#中定義了與訪問器同名的變量,則需要將對訪問器的調用限定為this.就像Ruby的案子一樣。


查看完整回答
反對 回復 2019-06-11
  • 3 回答
  • 0 關注
  • 532 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號