搜尋

首頁  >  問答  >  主體

一些關於ruby的初學者問題

我是因為用了coffee所以萌生出想學學ruby的想法的,因為才剛開始學習,所以有些問題可能比較初級。

Symbol對象的本質是什麼?

我看的代碼裏大量使用了:xxxx之類的語法,我從網上查到這個叫Symbol,從用法上來看它的本質應該是不是一種不需要預定義,但是會被預編譯的常量

在Class裏指向自身?

作為從其他語言轉向ruby的,我發現ruby在一個class調用this有如下幾種

  1. 使用self.xxxx
  2. 直接調用當前類定義的xxxx方法
  3. 使用@

這給我這種習慣了在java, php這類語言裏隻有一種方法引用類本身的人帶來了疑惑(當然java也可以省略this),可以具體解釋下這三類用法的區別麼?

在Class裏直接寫代碼?

我在很多rails項目發現了這種代碼

class Person
  attr_accessor :name

  def set_name(your_name)
    name = your_name 
  end
end

def ... end那個沒啥問題,但是前麵的attr_accessor :name怎麼看怎麼像一個正常的方法調用嘛,是這樣嗎?這裏的方法跟一般的方法有啥不同?為啥要這樣寫。因為一般的語言class裏都隻是聲明語法,雖然scala之類的語言也可以執行代碼,但不知道ruby的這種寫法有什麼應用場景。

PHPzPHPz2889 天前1100

全部回覆(5)我來回復

  • 天蓬老师

    天蓬老师2017-04-22 09:01:56

    1. Symbol是Ruby的一種基本型別(也是一種類別),屬於常數,用法跟枚舉型別差不多
    2. 方法1和2是等價的,因為這時候self指涉這個類別。一般用方法1,因為可以避免類別重命名時需要修改的問題,而且可以加入到snippet裡面。
    3. attr_accessor生成getter和setter方法。同样的,attr_reader生成getter,而attr_writer生成setter。在ruby裡,在class中執行特殊的方法是常見的做法,這些方法一般都是用來修改(或增添)該class的某些特性的。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-22 09:01:56

    1.String在ruby中是變數 Symbol是常數
    2. 1和2相同 @是類別成員 一個方法提供多重途徑呼叫在ruby中很常見
    3.等同於提供了預設的getter/setert方法

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-22 09:01:56

    你的問題有上下文關係,我倒著回复,你可能更好理解:)

    3. attr_accessor

    執行程式碼,看看結果。就明白了。 attr_accessor 是一個方法,執行完後,會動態加入方法到class內。

    這就是ruby的元程式設計。很牛的說:

    module Mod
      attr_accessor(:one, :two)
    end
    Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]
    

    1. symbol

    剛剛的attr_accessor 的例子,其中用到了symbol(冒號打頭的)。

    為何不用字串?因為用這個方法要產生很多方法,而方法是一種符號,而不是字串。更細節的,我以前是從自己寫Lisp 解釋器的時候,了解了symbol vs. string的區別。而ruby因為支援元編程,因此引入了一些編譯器的概念進來,增強了語言的柔性。這個是確實很牛的。

    2. self和直接呼叫方法等價,都是呼叫成員方法。而用@呼叫的是類別方法。

    就是說,需要區分類方法和實例方法。 class method vs. member method .這個其他的語言,很多也支持這樣的差異。

    簡而言之,class method 不必實例化就可以調用,而member method必須實例才能調用。

    class foo def bar end end
    foo.new.bar #调用实例方法,必须先new
    
    class foo def self.bar end end 
    foo.bar #无需实例化
    
    ref:http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/
    

    回覆
    0
  • 高洛峰

    高洛峰2017-04-22 09:01:56

    ruby的方法都是透過物件呼叫的,該物件稱為方法的receiver,物件的方法是在該物件所屬的類別中定義的。
    如何確定方法的receiver呢?可以遵循以下原則。
    1.明確呼叫時,receiver很顯然,就是你給的那個物件。
    2.隱式呼叫的方法,其receiver為self。
    3.self是指:
    (1)在模組/類別內部,self指的是該模組/類別(ruby的模組/類別也是物件)。如
    class MyClass
    self #這裡self就是MyClass物件
    end
    (2)在方法內部,self指的是該方法的receiver。如
    def method
    self #這裡self就是呼叫該方法時所使用的receiver
    #它是在方法被呼叫時才決定下來的
    end
    @開頭的是實例變量,跟方法是兩碼事。
    ruby的學問太多,三言兩語很難說清楚,這裡提到的只是冰山一角。 ruby有一套非常嚴謹完備的邏輯體系。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-22 09:01:56

    attr_accessor是聲明
    樓主先學完文法吧

    回覆
    0
  • 取消回覆