`
fantaxy025025
  • 浏览: 1311556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Rails_Xattr_accessor_方法小结

 
阅读更多

 

一。基础知识:实例变量的特殊性:

ruby中的实例变量,是在实例变量的表中去寻找的。这样,一个@name在没有定义的时候,寻找的结果是nil,而不是异常。

但是,如果没有定义类变量@@buffer,则会抛出异常。

 

class MAttrAccessorTest
  #ok~
  puts @name #=>nil
  #ERROR
  puts @@buffer #=>uninitialized class variable @@aaa in MAttrAccessorTest (NameError)
end
 

 

二。attr_accessor,自动给实例变量加入get set 方法

例子:

 

class AttrAccessorTest
  attr_accessor :name, :age

  #get method
  def love
    @love
  end
  #set method
  def love=(love)
    @love = love
  end
end
 

 

输出:

user = AttrAccessorTest.new

user.name = "June"

puts user.inspect

puts user.age #=>nil

 

puts user.inspect

user.age = 29

puts user.age

puts user.inspect

 

 

三。mattr_accessor :user_buffer

这个方法会在module中定义一个类变量:@@user_buffer;

同时定义对这个类变量的get,set方法,注意是实例方法。

这样,当包含这个模块的时候,会有@@user_buffer这个类变量,和get/set方法。

因为类变量是给所有实例共享的,所以某个实例修改这个类变量后,其他实例访问到的类变量也发生变化了。

 

例子:

module MAttrAccessorTest
  mattr_accessor :user_buffer
 
  #这个时候这里不会报错了!!!
  puts @@user_buffer
end
 
class AttrAccessorTest
  include MAttrAccessorTest
end
 
user1 = AttrAccessorTest.new
user2 = AttrAccessorTest.new
 
puts "user1.user_buffer = #{user1.user_buffer.inspect}"
puts "user2.user_buffer = #{user2.user_buffer.inspect}"
 
user1.user_buffer = []
user1.user_buffer << "Fantaxy"
puts "user1.user_buffer = #{user1.user_buffer.inspect}"
puts "user2.user_buffer = #{user2.user_buffer.inspect}"
 
user2.user_buffer << "June"
puts "user1.user_buffer = #{user1.user_buffer.inspect}"
puts "user2.user_buffer = #{user2.user_buffer.inspect}"
 

输出:

nil

user1.user_buffer = nil

user2.user_buffer = nil

user1.user_buffer = ["Fantaxy"]

user2.user_buffer = ["Fantaxy"]

user1.user_buffer = ["Fantaxy", "June"]

user2.user_buffer = ["Fantaxy", "June"]

 

 

四。cattr_accessor :user_buffer

同mattr_accessor,只不过是使用在了类中。

 

例子:

class AttrAccessorTest
  mattr_accessor :user_buffer
 
  #这个时候这里不会报错了!!!
  puts @@user_buffer
end
 
user1 = AttrAccessorTest.new
user2 = AttrAccessorTest.new
 
puts "user1.user_buffer = #{user1.user_buffer.inspect}"
puts "user2.user_buffer = #{user2.user_buffer.inspect}"
 
user1.user_buffer = []
user1.user_buffer << "Fantaxy"
puts "user1.user_buffer = #{user1.user_buffer.inspect}"
puts "user2.user_buffer = #{user2.user_buffer.inspect}"
 
user2.user_buffer << "June"
puts "user1.user_buffer = #{user1.user_buffer.inspect}"
puts "user2.user_buffer = #{user2.user_buffer.inspect}"
 
输出:
nil
user1.user_buffer = nil
user2.user_buffer = nil
user1.user_buffer = ["Fantaxy"]
user2.user_buffer = ["Fantaxy"]
user1.user_buffer = ["Fantaxy", "June"]
user2.user_buffer = ["Fantaxy", "June"]
 

输出:

nil

user1.user_buffer = nil

user2.user_buffer = nil

user1.user_buffer = ["Fantaxy"]

user2.user_buffer = ["Fantaxy"]

user1.user_buffer = ["Fantaxy", "June"]

user2.user_buffer = ["Fantaxy", "June"]

 

五。class_inheritable_accessor

不要使用这个为好:

#1,貌似有bug 

#2,晦涩且复杂度高,容易出错

 

 

class Parent
  class_inheritable_accessor :name, :age
  self.name = "Human" #注意这里必须先赋值,否则就不灵了哦,请对比:superclass_delegating_accessor
  self.age  = "2000_000 years"

  def to_s
    "name = #{name}, age = #{age}"
  end
end

class Child < Parent

end

parent = Parent.new
puts "parent: #{parent}"
parent.name = "JRuby Programmer"
parent.age  = "3 years ago"
puts "parent: #{parent}"

puts "----"
child1 = Child.new
child2 = Child.new
puts "child1: #{child1}"
puts "child2: #{child2}"

puts "----"
child1.name = "Programmer"
child1.age  = "100 years ago"
puts "child1.name = #{child1.name}, child1.age = #{child1.age}"
puts "child2.name = #{child2.name}, child2.age = #{child2.age}"

puts "----"
child2.name = "Java Programmer"
child2.age  = "From 1991"
puts "child1.name = #{child1.name}, child1.age = #{child1.age}"
puts "child2.name = #{child2.name}, child2.age = #{child2.age}"
 

六。superclass_delegating_accessor

这个也被rails3废弃了。

 

附:

mattr_accessor和cattr_accessor源码简析:

#1 在Class中加入了实例方法:mattr_accessor/cattr_accessor

#2 这些实例方法对于每个类来说,属于类方法

#3 这些类方法能在类的作用域内使用,格式如:mattr_accessor :user_buffer, :visit_buffer

#4 这些方法本身使用class_eval/module_eval往类中加入实例方法,即get/set方法

#5 这些get/set方法操作的变量都是类变量,能被其所有类和实例共享

 

另外:

如果使用:instance_writer => false 则表示关闭实例对类变量的写权限

例子: mattr_accessor :user_buffer, :instance_writer => false

 

+

+

+

*

+

+

+

 

 

分享到:
评论

相关推荐

    weixin_rails_middleware, 微信集成 ruby weixin_rails_middleware for integration weixin..zip

    `weixin_rails_middleware` 是一个开源的 Ruby 框架中间件,设计用于帮助开发者轻松地在 Rails 应用程序中集成微信服务。这个中间件提供了与微信API交互的功能,包括验证微信服务器的请求、处理用户消息、以及发送...

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器.zip

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板.zip

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的Collection 组装 Rails 应用程序。"你可以使用 rails_...

    inspinia admin - v2.5 Rails_Full_Version

    "inspinia admin - v2.5 Rails_Full_Version" 是一个基于Rails框架构建的后台管理系统的完整版本。这个系统采用流行的Inspinia Admin模板,提供了丰富的功能和自定义选项,旨在帮助开发者快速构建高效、现代且用户...

    InspiniaAdmin 2.6.1 Rails_Full_Version

    在Rails_Full_Version压缩包中,包含了完整的源代码和必要的资源文件,开发者可以通过解压并导入到Rails项目中,按照官方文档进行配置和定制。同时,这个版本可能还包含了升级记录、更改日志和可能的bug修复,以保证...

    agile_web_development_with_rails_3rd_edition.9994652073.pdf

    《敏捷Web开发与Rails》第三版是一本深入探讨Ruby on Rails框架在敏捷软件开发方法论下的应用指南。本书由多位知名作者共同编写,包括Sam Ruby、Dave Thomas、David Heinemeier Hansson等,他们都是在Ruby社区内享有...

    rails_best_practices:Rails项目的代码度量工具

    rails_best_practices rails_best_practices是用于检查Rails代码质量的代码度量工具。 它支持以下ORM / ODM: 活动记录 蒙古型 mongomapper 以及以下模板引擎: erb 哈姆 减肥 拉布尔 rails_best_practices...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    inspinia admin - v2.5 Rails_Seed_Project

    本文将详细探讨其在Rails框架下的种子项目(Rails_Seed_Project),旨在帮助开发者更好地理解和运用这一强大的工具。 首先,我们来了解一下“Inspinia Admin”。这是一款基于Bootstrap 3构建的响应式后台模板,提供...

    InspiniaAdmin 2.5 Rails_Seed_Project

    InspiniaAdmin 2.5 Rails_Seed_Project是一款基于Bootstrap框架的高级管理模板,专为Ruby on Rails开发者设计,旨在加速Web应用程序的开发过程。这个项目作为种子启动器,提供了完整的后台管理界面,包括丰富的UI...

    bhl_rails_solr-源码.rar

    《深入解析bhl_rails_solr源码》 在当今的Web开发领域,Rails框架以其高效、简洁的设计理念,深受开发者喜爱。同时,Solr作为一款强大的全文搜索引擎,被广泛应用于各类复杂的数据检索场景。当这两者结合时,便诞生...

    Ruby on Rails_ Up and Running

    RUBY的经典之作,对其在RAILS下开发写得很详细

    ruby rails_kindeditor(编译器)插件

    接着,在需要使用富文本编辑器的地方,比如文章或博客的模型中,设置相应的数据库字段类型为 text,并在视图文件中使用 `rails_kindeditor` 提供的 helper 方法来渲染编辑器。 集成过程中,你可能需要关注以下几个...

    Rails_3_Cheat_Sheets.pdf

    Rails_3_Cheat_Sheets.pdf

    rails_admin_content_builder:使用rails_admin创建内容的简单方法

    gem 'rails_admin_content_builder' 运行生成器并进行迁移 rails g rails_admin_content_builder rake db:migrate 在app / assets / application.scss中添加样式 * = require rails_admin_content_builder 用法 ...

    InspiniaAdmin 2.5 Rails_full_version

    InspiniaAdmin 2.5 Rails_full_version

    RestFul_Rails_Dev_pdf_v_0.1.zip

    本资料“RestFul_Rails_Dev_pdf_v_0.1.zip”包含了《RESTful Rails Development》的翻译版,将深入探讨如何在Rails中实现RESTful的设计模式。 首先,RESTful设计的核心概念是资源(Resources)。在Rails中,资源...

    rails_admin_theme:rails_admin主题平面主题

    默认引导程序3 rails_admin主题的现代替代。 它提供新闻颜色,调整和全新的树状视图菜单。 您可以将其派生并根据需要更改variables.scss ! 宝石文件 gem 'rails_admin_rollincode' , '~&gt; 1.0' gem 'rails_admin'...

Global site tag (gtag.js) - Google Analytics