찾다

 >  Q&A  >  본문

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

PHPzPHPz2780일 전1034

모든 응답(5)나는 대답할 것이다

  • 天蓬老师

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

    1. Symbol은 Ruby의 기본 유형(클래스이기도 함)이며 상수이며 사용법은 열거형과 유사합니다
    2. self가 현재 이 클래스를 참조하므로 방법 1과 2는 동일합니다. 방법 1은 클래스 이름 변경 시 수정 문제를 피할 수 있고, 스니펫에 추가할 수 있기 때문에 일반적으로 사용됩니다.
    3. attr_accessorgetter 및 setter 메서드를 생성합니다. 마찬가지로 attr_reader는 getter를 생성하고 attr_writer는 setter를 생성합니다. Ruby에서는 클래스에서 특수 메소드를 실행하는 것이 일반적입니다. 이러한 메소드는 일반적으로 클래스의 특정 기능을 수정(또는 추가)하는 데 사용됩니다.

    회신하다
    0
  • 巴扎黑

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

    1.루비에서는 문자열이 변수이고 기호는 상수입니다
    2. 1과 2는 동일합니다. @는 클래스 멤버입니다. Ruby에서는 메소드를 호출하는 여러 가지 방법을 제공하는 것이 매우 일반적입니다. 3. 기본 getter/setert 메소드 제공과 동일

    회신하다
    0
  • 伊谢尔伦

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

    귀하의 질문은 상황에 맞는 것이므로 거꾸로 답변해 드리겠습니다. 이해하시는 것이 더 좋을 것입니다. :)

    3. attr_accessor

    코드를 실행하고 결과를 확인해보세요. 그냥 이해하세요. attr_accessor는 실행 후 클래스에 동적으로 추가되는 메소드입니다.

    루비에서의 메타프로그래밍입니다. 매우 훌륭하다고 말했습니다:

    으아악

    1. 기호

    지금은 attr_accessor의 예에서 기호(콜론으로 시작)를 사용합니다.

    왜 문자열을 사용하지 않나요? 이 메서드를 사용하면 많은 메서드를 생성해야 하고 메서드는 문자열이 아니라 기호이기 때문입니다. 좀 더 자세하게, 나는 Lisp 인터프리터를 작성하면서 기호와 문자열의 차이점에 대해 배웠습니다. Ruby는 메타프로그래밍을 지원하므로 언어의 유연성을 향상시키기 위해 몇 가지 컴파일러 개념을 도입합니다. 정말 대단해요.

    2. Self는 메서드를 직접 호출하는 것과 동일하며 둘 다 멤버 메서드를 호출합니다. @로 호출되는 것이 클래스 메소드입니다.

    즉, 클래스 메소드와 인스턴스 메소드를 구별해야 합니다. 클래스 메소드 vs. 멤버 메소드.다른 많은 언어도 이 차이점을 지원합니다.

    간단히 말하면, 클래스 메소드는 인스턴스화 없이 호출할 수 있는 반면, 멤버 메소드는 호출하기 전에 인스턴스화해야 합니다.

    으아악

    회신하다
    0
  • 高洛峰

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

    Ruby의 메소드는 모두 메소드의 수신자라고 불리는 객체를 통해 호출됩니다. 객체의 메소드는 객체가 속한 클래스에서 정의됩니다.
    메소드의 수신자를 어떻게 결정합니까? 다음 원칙을 따를 수 있습니다.
    1. 명시적으로 호출되면 수신자는 분명히 사용자가 제공한 객체입니다.
    2. 수신자가 self인 암시적으로 호출되는 메서드.
    3.self는 다음을 의미합니다:
    (1) 모듈/클래스 내에서 self는 모듈/클래스를 참조합니다(Ruby 모듈/클래스도 객체입니다).
    등 클래스 마이클래스
    self #여기서 self는 MyClass 객체입니다

    (2) 메소드 내에서 self는 메소드의 수신자를 나타냅니다.
    등 def 방법
    self #여기서 self 가 이 메서드를 호출할 때 사용되는 수신자
    입니다. #메소드가 호출되면 결정됩니다

    @로 시작하는 것은 인스턴스 변수로, 메소드와는 다릅니다.
    루비에 관한 지식은 너무 많아서 몇 마디로 명확하게 설명하기가 어렵습니다. 여기서 언급한 내용은 빙산의 일각에 불과합니다. Ruby는 매우 엄격하고 완전한 논리 시스템을 갖추고 있습니다.

    회신하다
    0
  • 天蓬老师

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

    attr_accessor는 명령문입니다
    문법 먼저 익히도록 할게요

    회신하다
    0
  • 취소회신하다