我是因为用了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
巴扎黑2017-04-22 09:01:56
1.RubyではStringは変数、Symbolは定数です
2. 1 と 2 は同じです。 @ はクラスのメンバーです。 Ruby ではメソッドを呼び出す方法が複数あることがよくあります
。
3. デフォルトの getter/setert メソッドを提供するのと同等
伊谢尔伦2017-04-22 09:01:56
あなたの質問は状況に応じたものです、私は逆向きに返信します、あなたはそれをよりよく理解できるかもしれません:)
コードを実行して結果を確認します。ただ理解してください。 attr_accessor はメソッドです。実行後、メソッドはクラスに動的に追加されます。
これは Ruby のメタプログラミングです。とても素晴らしい言葉です:
リーリー先ほどの attr_accessor の例では、シンボル (コロンで始まる) が使用されています。
文字列を使用しないのはなぜですか?このメソッドを使用して多くのメソッドを生成する必要があり、メソッドは文字列ではなくシンボルであるためです。さらに詳しく言うと、私は独自の Lisp インタプリタを作成していたときに、シンボルと文字列の違いについて学びました。 Ruby はメタプログラミングをサポートしているため、言語の柔軟性を高めるためにいくつかのコンパイラの概念が導入されています。これは本当にすごいですね。
つまり、クラスメソッドとインスタンスメソッドを区別する必要があります。 クラスメソッドとメンバーメソッド。他の多くの言語もこの違いをサポートしています。
つまり、クラス メソッドはインスタンス化せずに呼び出すことができますが、メンバー メソッドは呼び出す前にインスタンス化する必要があります。
リーリー高洛峰2017-04-22 09:01:56
Ruby のメソッドはすべてオブジェクトを通じて呼び出されます。オブジェクトはメソッドのレシーバーと呼ばれます。オブジェクトのメソッドは、オブジェクトが属するクラス内で定義されます。
メソッドの受信者を決定するにはどうすればよいですか?次の原則に従うことができます。
1. 明示的に呼び出された場合、受信者は明らかに、指定したオブジェクトになります。
2. レシーバーが self である暗黙的に呼び出されるメソッド。
3.自分自身とは次のことを指します:
(1) モジュール/クラス内では、self がモジュール/クラスを参照します (Ruby のモジュール/クラスもオブジェクトです)。
など
クラスMyClass
self #ここでは self が MyClass オブジェクトです
終わり
(2) メソッド内では、self はメソッドの受信者を指します。
など
デフメソッド
self #ここで self は、このメソッドを呼び出すときに使用されるレシーバーです
#メソッド呼び出し時に決定されます
終わり
@ で始まるものはインスタンス変数であり、メソッドとは異なります。
Ruby については非常に多くの知識があるため、ここで述べたことは氷山の一角にすぎません。 Ruby には非常に厳密で完全な論理システムがあります。