(Ruby/Python/Perl)

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

  1. class Rectangle
  2. attr_accessor :width
  3. attr_accessor :height
  4. attr_accessor :width2
  5. attr_accessor :height2
  6.  
  7. def initialize(wdth, hgt)
  8. @width = wdth
  9. @height = hgt
  10. end
  11.  
  12. def area()
  13. return @width * @height
  14. end
  15.  
  16. def area2()
  17. return @width2 * @height2
  18. end
  19.  
  20. end
  21.  
  22. r = Rectangle.new(2,3)
  23. r.width = 5 # give samename's variable value 给同名变量的变量赋值
  24. r.height = 5
  25. puts r.area() # outputs is 25
  26.  
  27. r.width2 = 6 # not samename's variable create 无同名变量的变量创建
  28. r.height2 = 6
  29. puts r.area2() # outputs is 36

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

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

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

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

  1. class Module
  2. def var( method_name )
  3. inst_variable_name = "@#{method_name}".to_sym # .to_sym
  4. p inst_variable_name #:=>:@bar
  5.  
  6. define_method method_name do
  7. instance_variable_get inst_variable_name
  8. end
  9.  
  10. define_method "#{method_name}=" do |new_value|
  11. instance_variable_set inst_variable_name, new_value
  12. end
  13.  
  14. end
  15. end
  16.  
  17. class Foo
  18. var :bar
  19. end
  20.  
  21. f = Foo.new # p f.bar
  22. p f.class #:=>Foo
  23. p f.class.instance_methods(false) #:=>["bar", "bar="]
  24. f.bar = "good" #:=>"good" method bar=
  25. p f.bar #:=>"good" method bar

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

  1. class Fred
  2. #attr_accessor :a #不要去掉注释,先直接运行
  3. #attr_accessor :b
  4.  
  5. def initialize(p1, p2)
  6. @a, @b = p1, p2
  7. end
  8. end
  9. fred = Fred.new('cat', 99)
  10. puts fred.instance_variable_get(:@a) #=> "cat"
  11. puts fred.instance_variable_get("@b") #=> 99
  12. #puts fred.a,fred.b,fred.a.class,fred.b.class
  13. =begin 上一句结果
  14. cat
  15. 99
  16. String
  17. Fixnum
  18. =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. Android 隐式意图激活另外一个Actitity

    上篇文章<Android 显示意图激活另外一个Actitity>最后谈到显示意图激活另外一个Actitity会有一些局限性和弊端 本文介绍另一种方法:隐式意图激活另外一个Actitity ...

  2. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  3. 我的第一节Android课

    我的第一节安卓课程,今天非比寻常的一天,我开始了我程序猿之路的第一节安卓课程,安卓课程只是我的一个兴趣班,我的本专业是java开发,因为喜欢做一个属于自己的一个手机APP,就选多个一样技能,毕竟十八般 ...

  4. iOS 杂笔-24(常用类到NSObject的继承列表)

    iOS 杂笔-24(常用类到NSObject的继承列表) NSString NSObject->NSString NSArray NSObject->NSArray ↑OC基本类都直接继承 ...

  5. linux下安装opcache扩展

    linux下安装opcache扩展   参考:http://www.php.net/manual/zh/opcache.installation.php 1 2 3 4 5 6 7 wget http ...

  6. .NET读写Excel工具Spire.XlS使用(DataExport )

    Introduction E-ICEBLUE is developing office.net component, the main products include Spire.Doc, Spir ...

  7. IntelliJ IDEA 使用Git怎样记住密码和忘记密码的方法

    IntelliJ IDEA 使用Git怎样记住密码的方法 1.当使用Ctrl+T进行更新时,弹出密码框(此时不要输入任何字符),直接点"Cancel" 2.略等二三秒,会弹出新的密 ...

  8. 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

    在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

  9. MongoDB 优点

    任何关系型数据库,具有典型的架构设计,显示表和这些表之间的关系.虽然在 MongoDB中,没有什么关系的概念. MongoDB比RDBMS的优势 架构:MongoDB是文档型数据库,其中一个集合保存不 ...

  10. 天书笔记:HTML+CSS实现顶部导航栏

    此笔记纯属本人脑残笔记,阅读困难不理解属正常现象,初学者尽量不要阅读,否则轻则口吐白沫重则走火入魔,切记切记 先晒效果图: 效果要求类似于b站的顶部导航(..原谅我老是拿b站做例子:) ) 然后是代码 ...