ruby语法-attr_accessor方法使用

本文主要讲解下ruby下attr_accessor方法的使用。

示例1:

class Person
end person = Person.new
person.name # => no method error

显然,我们Person类里没有定义name的方法,执行报错。

示例2:

class Person
def name
@name # simply returning an instance variable @name
end
end person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error

其中,"person.name"是调用的读方法(reader),"person.name = "Dennis""调用的是写方法(writer)。

虽然我们创建了name的函数,但是我们仍然不能给name变量赋值。那么我们怎么才能使用writer方法呢,请看接下来的例子。

示例3

class Person
def name
@name
end def name=(str)
@name = str
end
end person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

在这个实例中,我们实现了对@name变量的读和写。

但是,如果这样写是不是太麻烦了? 有没有简单的方式实现相同的功能呢?

示例4

class Person
attr_reader :name
attr_writer :name
end

attr_xxx方法出现了,这两个方法和示例3效果相同。想看更简单的方式?接着来

示例5

class Person
attr_accessor :name def greeting
"Hello #{@name}"
end
end person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

"attr_accessor :name"方法包含了attr_reader和attr_reader方法,实现了对实例变量@name的writter和reader。

总结:

attr_accessor方法包含了attr_reader和attr_reader方法,当使用attr_accessor方法时,可以通过类实例对指定的变量赋值和读操作。

一个小问题?

为什么不直接用"attr_accessor @name"这种形式呢?为什么非要用":"符号去做声明?

    要理解attr_accessor是一个方法调用,":name"是这个方法的一个参数,":"不是特殊的语法。

    如果你使用"attr_accessor @name"的形式,那么会被ruby解析为"attr_accessor nil",是不能通过类实例给name赋值的,会产生报错信息"`attr_accessor': nil is not a symbol nor a string (TypeError)"

ruby-attr_accessor使用的更多相关文章

  1. [No000011]Ruby之attr_reader,attr_writer,attr_accessor理解&用法

    (Ruby/Python/Perl) Ruby 语言与Python和Perl的一个很大区别,在于Ruby中,所有的实例变量都是在类中完全私有的,只能通过accessor 方法来进行变量访问,引用一段代 ...

  2. 详解ruby的attr_accessor和cattr_accessor

    原文地址:http://lee2013.iteye.com/blog/1098914 1. attr_accessor的用法相当简单, 就相当于getter和setter,看一个类就知道怎样用了: c ...

  3. ruby 疑难点之—— attr_accessor attr_reader attr_writer

    普通的实例变量 普通的实例变量,我们没法在 class 外面直接访问 #普通的实例变量,只能在 class 内部访问 class C1 def initialize(name) @name = nam ...

  4. Ruby attr_reader , attr_writer, attr_accessor方法

    attr_reader方法------读取实例变量 attr_writer方法------改写实例变量 attr_accessor方法-----读写实例变量 class Person attr_rea ...

  5. ruby 基础知识(一)

    突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html    相信初学者会受益颇多 ruby  参考文档 ...

  6. Ruby学习笔记0708

    #!/usr/bin/env ruby class MegaGreeter attr_accessor :names # 初始化這個物件 def initialize(names = "Wo ...

  7. Ruby学习之module

    我们可以认为module是一个专门存放一系列方法和常量的工具箱. module和class非常像, 只是module不能创建实例也不能有子类, 它们仅仅能存放东西. 例如: module Circle ...

  8. Ruby类的继承

    Ruby继承的语法 class DerivedClass < BaseClass #some stuff end < 为继承符号 重写(override) 的概念 有时, 我们希望子类从父 ...

  9. [ruby on rails] 深入(2) ruby基本语法

    1. 调试&注释&打印输出 1.1 调试 ruby属于解释型语言,即脚本,在linux上,脚本的执行无非三种: 1. 用解释器运行脚本 解释器 脚本文件 即:ruby  脚本文件 2. ...

  10. ruby基础语法

    首发:个人博客,更新&纠错&回复 学不同语言,常将它们的基础语法搞混,例如if后面有没有(),后面是then还是:还是{,结尾是end还是}. 这种事情毫无技术含量又毫无乐趣可言,但极 ...

随机推荐

  1. error: ModuleNotFoundError: No module named 'ConfigParser'

    (env2.7) Kaitlyns-Mac:bin kaitlyn$ pip install MySQL-python Looking in indexes: https://pypi.tuna.ts ...

  2. Eureka的服务注册与发现概念(三)

    一.Eureka介绍 Netflix在设计Eureka时遵守的AP原则.Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层 ...

  3. 关于PHP架构师进阶的一些思考

    相信大家都有感觉,就是当程序员写业务写了几年后,就会有想进阶的想法,技术方面当然就是架构师了,然后具体从哪些方面丰富自己才能个达到目的呢?大部分人可能会很迷茫,当然也包括我, 最近和很多大牛交流了一些 ...

  4. makefile入门-初步了解

    自己开始学习makefile是由于VScode配置工程文件,看别人的配置不是很懂,于是决定入门学习下makefile. 先来说说makefile是做什么用的:makefile可以实现工程的自动化编译, ...

  5. [精华][推荐]CAS SSO实现单点登录框架学习源码

    1.通过下载稳定版本的方式下载cas的相关源码包,如下: 直接选择4.2.1的稳定代码即可 2.我们项目中的版本版本使用maven apereo远程库去下载 通过远程maven库下载cas-serve ...

  6. Java第4次实训作业

    编写"电费管理类"及其测试类. 第一步 编写"电费管理"类 私有属性:上月电表读数.本月电表读数 构造方法:无参.2个参数 成员方法:getXXX()方法.se ...

  7. 文件扩展关联命令(assoc)

    assoc 命令: // 描述: (association) --> 联想.关联 显示或修改文件扩展名关联. 如果在没有参数的情况下使用,assoc将显示所有当前文件扩展名关联的列表. // 语 ...

  8. Python中logging日志模块的使用

    参考https://www.cnblogs.com/CJOKER/p/8295272.html

  9. 【转】async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

  10. [总结]给pcDuino v2编译Linux kernel

    1.版本问题 推荐选择pcdunio提供的官方的kernel. 当然可以选用www.github.com/linux-sunxi 中的kernel,不过有很多驱动都用不了包括arduino. 我尝试了 ...