我是因为用了coffee所以萌生出想学学ruby的想法的,因为才刚开始学习,所以有些问题可能比较初级。
我看的代码里大量使用了:xxxx
之类的语法,我从网上查到这个叫Symbol
,从用法上来看它的本质应该是不是一种不需要预定义,但是会被预编译的常量?
作为从其他语言转向ruby的,我发现ruby在一个class调用this
有如下几种
self.xxxx
xxxx
方法@
这给我这种习惯了在java
, php
这类语言里只有一种方法引用类本身的人带来了疑惑(当然java也可以省略this),可以具体解释下这三类用法的区别么?
我在很多rails项目发现了这种代码
class Person
attr_accessor :name
def set_name(your_name)
name = your_name
end
end
def ... end
那个没啥问题,但是前面的attr_accessor :name
怎么看怎么像一个正常的方法调用嘛,是这样吗?这里的方法跟一般的方法有啥不同?为啥要这样写。因为一般的语言class里都只是声明语法,虽然scala
之类的语言也可以执行代码,但不知道ruby的这种写法有什么应用场景。
天蓬老师2017-04-22 09:01:56
attr_accessor
生成getter和setter方法。同样的,attr_reader
生成getter,而attr_writer
生成setter。在ruby裡,在class中執行特殊的方法是常見的做法,這些方法一般都是用來修改(或增添)該class的某些特性的。 巴扎黑2017-04-22 09:01:56
1.String在ruby中是變數 Symbol是常數
2. 1和2相同 @是類別成員 一個方法提供多重途徑呼叫在ruby中很常見
3.等同於提供了預設的getter/setert方法
伊谢尔伦2017-04-22 09:01:56
你的問題有上下文關係,我倒著回复,你可能更好理解:)
執行程式碼,看看結果。就明白了。 attr_accessor 是一個方法,執行完後,會動態加入方法到class內。
這就是ruby的元程式設計。很牛的說:
module Mod
attr_accessor(:one, :two)
end
Mod.instance_methods.sort #=> [:one, :one=, :two, :two=]
剛剛的attr_accessor 的例子,其中用到了symbol(冒號打頭的)。
為何不用字串?因為用這個方法要產生很多方法,而方法是一種符號,而不是字串。更細節的,我以前是從自己寫Lisp 解釋器的時候,了解了symbol vs. string的區別。而ruby因為支援元編程,因此引入了一些編譯器的概念進來,增強了語言的柔性。這個是確實很牛的。
就是說,需要區分類方法和實例方法。 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/
高洛峰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有一套非常嚴謹完備的邏輯體系。