我是因为用了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에서는 클래스에서 특수 메소드를 실행하는 것이 일반적입니다. 이러한 메소드는 일반적으로 클래스의 특정 기능을 수정(또는 추가)하는 데 사용됩니다. 巴扎黑2017-04-22 09:01:56
1.루비에서는 문자열이 변수이고 기호는 상수입니다
2. 1과 2는 동일합니다. @는 클래스 멤버입니다. Ruby에서는 메소드를 호출하는 여러 가지 방법을 제공하는 것이 매우 일반적입니다.
3. 기본 getter/setert 메소드 제공과 동일
伊谢尔伦2017-04-22 09:01:56
귀하의 질문은 상황에 맞는 것이므로 거꾸로 답변해 드리겠습니다. 이해하시는 것이 더 좋을 것입니다. :)
코드를 실행하고 결과를 확인해보세요. 그냥 이해하세요. attr_accessor는 실행 후 클래스에 동적으로 추가되는 메소드입니다.
루비에서의 메타프로그래밍입니다. 매우 훌륭하다고 말했습니다:
으아악지금은 attr_accessor의 예에서 기호(콜론으로 시작)를 사용합니다.
왜 문자열을 사용하지 않나요? 이 메서드를 사용하면 많은 메서드를 생성해야 하고 메서드는 문자열이 아니라 기호이기 때문입니다. 좀 더 자세하게, 나는 Lisp 인터프리터를 작성하면서 기호와 문자열의 차이점에 대해 배웠습니다. Ruby는 메타프로그래밍을 지원하므로 언어의 유연성을 향상시키기 위해 몇 가지 컴파일러 개념을 도입합니다. 정말 대단해요.
즉, 클래스 메소드와 인스턴스 메소드를 구별해야 합니다. 클래스 메소드 vs. 멤버 메소드.다른 많은 언어도 이 차이점을 지원합니다.
간단히 말하면, 클래스 메소드는 인스턴스화 없이 호출할 수 있는 반면, 멤버 메소드는 호출하기 전에 인스턴스화해야 합니다.
으아악高洛峰2017-04-22 09:01:56
Ruby의 메소드는 모두 메소드의 수신자라고 불리는 객체를 통해 호출됩니다. 객체의 메소드는 객체가 속한 클래스에서 정의됩니다.
메소드의 수신자를 어떻게 결정합니까? 다음 원칙을 따를 수 있습니다.
1. 명시적으로 호출되면 수신자는 분명히 사용자가 제공한 객체입니다.
2. 수신자가 self인 암시적으로 호출되는 메서드.
3.self는 다음을 의미합니다:
(1) 모듈/클래스 내에서 self는 모듈/클래스를 참조합니다(Ruby 모듈/클래스도 객체입니다).
등
클래스 마이클래스
self #여기서 self는 MyClass 객체입니다
끝
(2) 메소드 내에서 self는 메소드의 수신자를 나타냅니다.
등
def 방법
self #여기서 self 가 이 메서드를 호출할 때 사용되는 수신자
입니다.
#메소드가 호출되면 결정됩니다
끝
@로 시작하는 것은 인스턴스 변수로, 메소드와는 다릅니다.
루비에 관한 지식은 너무 많아서 몇 마디로 명확하게 설명하기가 어렵습니다. 여기서 언급한 내용은 빙산의 일각에 불과합니다. Ruby는 매우 엄격하고 완전한 논리 시스템을 갖추고 있습니다.