ホームページ  >  に質問  >  本文

一些关于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的这种写法有什么应用场景。

PHPzPHPz2761日前1019

全員に返信(5)返信します

  • 天蓬老师

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

    1. Symbol は Ruby の基本型 (クラスでもあります) であり、その使用法は列挙型の使用法と似ています。
    2. 現時点では self がこのクラスを参照しているため、メソッド 1 と 2 は同等です。方法 1 は、クラスの名前を変更する際の変更の問題を回避でき、スニペットに追加できるため、一般的に使用されます。
    3. セッターを生成します。 Ruby では、クラス内で特別なメソッドを実行するのが一般的です。これらのメソッドは通常、クラスの特定の機能を変更 (または追加) するために使用されます。 attr_accessor生成getter和setter方法。同样的,attr_reader生成getter,而attr_writer
    4. 返事
      0
  • 巴扎黑

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

    1.RubyではStringは変数、Symbolは定数です
    2. 1 と 2 は同じです。 @ はクラスのメンバーです。 Ruby ではメソッドを呼び出す方法が複数あることがよくあります
    。 3. デフォルトの getter/setert メソッドを提供するのと同等

    返事
    0
  • 伊谢尔伦

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

    あなたの質問は状況に応じたものです、私は逆向きに返信します、あなたはそれをよりよく理解できるかもしれません:)

    3.attr_accessor

    コードを実行して結果を確認します。ただ理解してください。 attr_accessor はメソッドです。実行後、メソッドはクラスに動的に追加されます。

    これは Ruby のメタプログラミングです。とても素晴らしい言葉です:

    リーリー

    1.シンボル

    先ほどの attr_accessor の例では、シンボル (コロンで始まる) が使用されています。

    文字列を使用しないのはなぜですか?このメソッドを使用して多くのメソッドを生成する必要があり、メソッドは文字列ではなくシンボルであるためです。さらに詳しく言うと、私は独自の Lisp インタプリタを作成していたときに、シンボルと文字列の違いについて学びました。 Ruby はメタプログラミングをサポートしているため、言語の柔軟性を高めるためにいくつかのコンパイラの概念が導入されています。これは本当にすごいですね。

    2. Self はメソッドを直接呼び出すことと同等で、どちらもメンバー メソッドを呼び出します。 @で呼び出されるのがクラスメソッドです。

    つまり、クラスメソッドとインスタンスメソッドを区別する必要があります。 クラスメソッドとメンバーメソッド。他の多くの言語もこの違いをサポートしています。

    つまり、クラス メソッドはインスタンス化せずに呼び出すことができますが、メンバー メソッドは呼び出す前にインスタンス化する必要があります。

    リーリー

    返事
    0
  • 高洛峰

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

    Ruby のメソッドはすべてオブジェクトを通じて呼び出されます。オブジェクトはメソッドのレシーバーと呼ばれます。オブジェクトのメソッドは、オブジェクトが属するクラス内で定義されます。
    メソッドの受信者を決定するにはどうすればよいですか?次の原則に従うことができます。
    1. 明示的に呼び出された場合、受信者は明らかに、指定したオブジェクトになります。
    2. レシーバーが self である暗黙的に呼び出されるメソッド。
    3.自分自身とは次のことを指します:
    (1) モジュール/クラス内では、self がモジュール/クラスを参照します (Ruby のモジュール/クラスもオブジェクトです)。
    など クラスMyClass
    self #ここでは self が MyClass オブジェクトです
    終わり
    (2) メソッド内では、self はメソッドの受信者を指します。
    など デフメソッド
    self #ここで self は、このメソッドを呼び出すときに使用されるレシーバーです
    #メソッド呼び出し時に決定されます
    終わり
    @ で始まるものはインスタンス変数であり、メソッドとは異なります。
    Ruby については非常に多くの知識があるため、ここで述べたことは氷山の一角にすぎません。 Ruby には非常に厳密で完全な論理システムがあります。

    返事
    0
  • 天蓬老师

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

    attr_accessor はステートメントです
    まずは文法の学習を終えてください

    返事
    0
  • キャンセル返事