(Ruby/Python/Perl)

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

class Rectangle
attr_accessor :width
attr_accessor :height
attr_accessor :width2
attr_accessor :height2 def initialize(wdth, hgt)
@width = wdth
@height = hgt
end def area()
return @width * @height
end def area2()
return @width2 * @height2
end end r = Rectangle.new(2,3)
r.width = 5 # give samename's variable value 给同名变量的变量赋值
r.height = 5
puts r.area() # outputs is 25 r.width2 = 6 # not samename's variable create 无同名变量的变量创建
r.height2 = 6
puts r.area2() # outputs is 36

attr_reader: 实例变量只读  attr_writer: 实例变量可写  attr_accessor: 变量可读可写

  近来学习ruby的过程中,看到了拟态方法的概念,感觉很有意思。我们都知道拟态方法在ruby中无处不在,可以让代码更清爽更容易理解,比如

  obj.my_attribute=""就不必写成obj.my_attribute=(""),而更进一步的,像attr_accessor这样的类宏的实现方式也引起了我的兴趣。

看了网上的实现方式,自己动手试了一下。

class Module
def var( method_name )
inst_variable_name = "@#{method_name}".to_sym # .to_sym
p inst_variable_name #:=>:@bar define_method method_name do
instance_variable_get inst_variable_name
end define_method "#{method_name}=" do |new_value|
instance_variable_set inst_variable_name, new_value
end end
end class Foo
var :bar
end f = Foo.new # p f.bar
p f.class #:=>Foo
p f.class.instance_methods(false) #:=>["bar", "bar="]
f.bar = "good" #:=>"good" method bar=
p f.bar #:=>"good" method bar

上面的var方法就类似于attr_accessor,对其中的instance_variable_get用代码进行一下说明:

class Fred
#attr_accessor :a #不要去掉注释,先直接运行
#attr_accessor :b def initialize(p1, p2)
@a, @b = p1, p2
end
end
fred = Fred.new('cat', 99)
puts fred.instance_variable_get(:@a) #=> "cat"
puts fred.instance_variable_get("@b") #=> 99
#puts fred.a,fred.b,fred.a.class,fred.b.class
=begin 上一句结果
cat
99
String
Fixnum
=end

我们都知道在ruby中:a等价于"a"但用前面的方法会更清爽,并且少写一个符号。

[No000011]Ruby之attr_reader,attr_writer,attr_accessor理解&用法的更多相关文章

  1. Ruby attr_reader , attr_writer, attr_accessor方法

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

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

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

  3. Ruby字符串(1):String基本用法

    String字符串 字符串由String类提供,除了直接使用单双引号或其它字面量创建字符串,也可以使用String.new()方法来创建. a = "hello" b = Stri ...

  4. query插件之ajaxForm ajaxSubmit的理解用法

    如今ajax满天飞,作为重点的form自然也受到照顾. 其实,我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如:   $(function(){ $('# ...

  5. Jquery插件之ajaxForm ajaxSubmit的理解用法

      如今ajax满天飞,作为重点的form自然也受到照顾. 其实,我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如:   $(function(){ $( ...

  6. Jquery插件之ajaxForm ajaxSubmit的理解用法(转)

    我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如: $(function(){ $('#myForm').submit(function(){ $.aja ...

  7. ruby http爬虫中的 :body 用法问题

    require 'http' url = 'http://localhost/b.php' data = 'whoami=whoami' html = HTTP.via('127.0.0.1',808 ...

  8. 读<<programming ruby>> 7.6节 flip-flop 理解

    书中源码是这样的 File.foreach('1.txt') do |x| if(($. == 1) || x =~ /eig/) .. (($. == 3) || x =~ /nin/) then ...

  9. ruby语言里的self理解

    关键的一句话:关键看谁调用self,self就属于谁 有3种情况: 1.在class或module的定义中,self代表这个class或者这个module对象,代码如下: class S puts ' ...

随机推荐

  1. iOS 单例模式 浅叙

    单例模式作用 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界使用 从而方便地控制了实例个数,并节约系统资源 单例模式使用场合 在整个引用程序中,共享一份资源(这份资源只需要创建初始 ...

  2. 基于SolrCloud的内容搜索和热点推送

    ➠更多技术干货请戳:听云博客 什么是热点 我认为热点有时效性和受众面 用户关注从低到高再到低的内容 .有公共热点和分类热点.例如医辽养老全民关注,科技汽车等只有特定的人群关注. 推送的条件 搜索频次达 ...

  3. 【VLC-Android】Mac下编译vlc-android

    前言 突然想整整VLC-Android,然后就下一个玩玩看,这里记录点遇到的问题. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: htt ...

  4. iOS [[NSBundle mainBundle] pathForResource:@"" ofType:@""]无法获取到文件

    将一个文件导入到工程中后,用[[NSBundle mainBundle] pathForResource:@"" ofType:@""]来获取到该文件时,一直无 ...

  5. 让shell脚本在后台飞

    1. 使用&符号在后台执行命令 你可以在Linux命令或者脚本后面增加&符号,从而使命令或脚本在后台执行,例如:. $ ./my-shell-script.sh & 2. 使用 ...

  6. python之递归实现

    一.递归函数 概念:递归算法是一种直接或者间接的调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的. 特点: ①递归就是在过程或者函数里调用自身. ②在使用递归策略时,必须有 ...

  7. MySQL数据库的导入和导出

    1.导入数据库 在命令行下输入: mysql -u username -p test < /home/data/test.sql 说明: username                   是 ...

  8. [转]输出带颜色的shell

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033 ...

  9. 关于SUID、SGID、Sticky

    SUID属性 passwd命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码.但是保存用户密码的/etc/shadow文件的权限是400,也就是说只有文件的所有者root用户可以写入, ...

  10. QT5.5.0版本添加icon图标步骤

    1.制作icon图标文件 可以进入这个网站在线制作:http://www.ico.la/ 2.创建资源文件:qrc文件 接着 添加2两项,先点击prefix,然后添加文件--->图标路径 3.可 ...