发布于 1970-01-01 08:00
  • 5 个回答
    • attr_accessor是声明
      楼主先学完语法吧

      2022-10-26 14:04 回答
    • 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有一套非常严谨完备的逻辑体系。

      2022-10-26 14:04 回答
    • 你的问题有上下文关系,我倒着回复,你可能更好理解:)

      3. attr_accessor

      执行代码,看看结果。就明白了。attr_accessor 是一个方法,执行完后,会动态添加方法到class内。

      这就是ruby的元编程。很牛的说:

      module Mod
        attr_accessor(:one, :two)
      end
      Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]
      

      1. symbol

      刚刚的attr_accessor 的例子,其中用到了symbol(冒号打头的)。

      为何不用字符串?因为用这个方法要生成很多方法,而方法是一种符号,而不是字符串。更加细节的,我以前是从自己写Lisp 解释器的时候,了解了symbol vs. string的区别。而ruby因为支持元编程,因此引入了一些编译器的概念进来,增强了语言的柔性。这个是确实很牛的。

      2. self和直接调用方法等价,都是调用成员方法。而用@调用的是类方法。

      就是说,需要区分类方法和实例方法。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/
      
      2022-10-26 14:05 回答
    • 1.String在ruby中是变量 Symbol是常量
      2. 1和2相同 @是类成员 一个方法提供多重途径调用在ruby中很常见
      3.等同于提供了默认的getter/setert方法

      2022-10-26 14:05 回答
      1. Symbol是Ruby的一种基本类型(也是一种类),属于常量,用法跟枚举类型差不多
      2. 方法1和2是等价的,因为这时候self指代这个类。一般用方法1,因为可以避免类重命名时需要修改的问题,而且可以加入到snippet里面。
      3. attr_accessor生成getter和setter方法。同样的,attr_reader生成getter,而attr_writer生成setter。在ruby里,在class中执行特殊的方法是常见的做法,这些方法一般都是用来修改(或增添)该class的某些特性的。
      2022-10-26 14:05 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有