`
cookoo
  • 浏览: 644478 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

Ruby简化属性声明与初始化

    博客分类:
  • Ruby
阅读更多
如果要一边声明一边初始化可以用这样的代码:
class Object 
  def better_accessor(attrs) 
    (class << self; self; end).send :attr_accessor, *attrs.keys
    attrs.each {|k,v| instance_variable_set("@#{k}", v)}
  end 
end

然后就可以这样用:
class Test
  def intialize
    better_accessor :foo =>'bar' #初始化值即定死(值的正确性就自己保证了,用户只能通过setter改)
  end
end

t = Test.new
t.foo #=> 'bar'

或者先建对象后加属性,不用先定死值,但是用户可以在声明时绕过可能的setter验证,不安全:
t2 = Object.new
t2.better_accessor :hello =>'world'
t2.hello #=> 'world'
分享到:
评论
8 楼 cookoo 2006-11-19  
恩,只能吃一个,不过函数名太长了,加个别名aawd大概才有人愿意用呵呵
7 楼 qiezi 2006-11-19  
打错了,是ActiveSupport里实现的:
class Module
  # Declare an attribute accessor with an initial default return value.
  #
  # To give attribute <tt>:age</tt> the initial value <tt>25</tt>:
  #  
  #   class Person
  #     attr_accessor_with_default :age, 25
  #   end
  #
  #   some_person.age
  #   => 25
  #   some_person.age = 26
  #   some_person.age
  #   => 26
  #
  # To give attribute <tt>:element_name</tt> a dynamic default value, evaluated
  # in scope of self:
  #
  #   attr_accessor_with_default(:element_name) { name.underscore } 
  #
  def attr_accessor_with_default(sym, default = nil, &block)
    raise 'Default value or block required' unless default || block
    define_method(sym, block_given? ? block : Proc.new { default })
    module_eval(<<-EVAL, __FILE__, __LINE__)
      def #{sym}=(value)
        class << self; attr_reader :#{sym} end
        @#{sym} = value
      end
    EVAL
  end
end

看样子一次只能声明一个。
6 楼 qiezi 2006-11-19  
ActiveResource里面新实现了一个attr_accessor_with_default:
Use attr_accessor_with_default to dry up attribute initialization. References #6538. [Stuart Halloway]

我还没看,不过看样子应该是这个功能。
5 楼 cookoo 2006-10-11  
:foo, :bar, :baz=>123 这样会被ruby理解为两个symbol参数,加一个有一个key的hash

我想应该这么做[:foo, :bar, :baz] => 3 然后里面逻辑再改一下,能处理key是array的情况
4 楼 ajoo 2006-10-11  
不成。有一个问题,Hash的key顺序不定。用来声明参数粉不好
3 楼 ajoo 2006-10-11  
最好这样:
class Test
  better_accessor :foo, :bar, :baz => 123
end

自动生成initializer,并且连带支持default parameter
2 楼 cookoo 2006-09-29  
你说的是要把better_accessor改成类方法啊?可以是可以,不过内部逻辑要改掉了,instance_variable_set只能放到实例方法里去用,如intialize。
1 楼 qiezi 2006-09-27  
能不能做成这样呢:
class Test
  better_accessor :foo => 'bar', :bar =>  1223
end

相关推荐

    auto_constructor:自动构造类和结构的初始化方法

    1. **声明类或结构体**:首先,你需要定义一个类或结构体,包含你想要自动初始化的字段。 ```crystal class MyClass property field1 : String property field2 : Int32 end ``` 2. **启用`auto_constructor`**:...

    GitHub倡导的Ruby代码编写风格总结

    10. **变量初始化**:使用`||=`初始化变量,但注意不要用于布尔类型变量。 11. **特殊变量名**:避免使用Perl风格的变量名(如$1到$9),以保持代码的Ruby风格。 #### 命名规范 1. **变量与方法**:变量和方法名称...

    中科院高级软件工程期末题库

    Git 工作流程主要包括初始化仓库、提交更改、分支管理、合并代码以及推送代码到远程仓库等步骤。通过使用 Git,开发者可以有效地协作并管理项目的版本历史。 ### 关于 Git 的选择题详解 1. **下面哪个 git 命令...

    JFinal1.8文档

    - 无XML配置:遵循约定优于配置(COC)的原则,JFinal几乎无需XML配置文件,简化了项目的初始化过程。 - ActiveRecord模式:JFinal通过ActiveRecordPlugin支持,使得数据库操作更为便捷快速。 - 自动加载:当Java...

    jdk1.7 64位官方版 jdk-7u79-linux-x64.tar.gz

    3. **尝试-with-resources**:这个新特性允许开发者在一个try语句块中声明并初始化资源,这些资源会在finally块中自动关闭,降低了资源泄露的风险。 4. **钻石操作符**:在创建泛型对象时,可以省略类型参数,...

    Spring-reference

    Spring 2.0允许开发者自定义Bean的性质,例如实现特定的生命周期接口,以控制Bean的初始化和销毁过程。 四、结论 Spring Framework 2.0的发布,不仅带来了功能上的强大增强,还优化了配置方式,降低了学习曲线。...

    spring-reference

    Spring提供了BeanPostProcessor、InitializingBean、DisposableBean等生命周期接口,允许开发者在Bean初始化前后执行自定义的操作。 #### 5.2 更多的定制选项 Spring还提供了许多其他的定制选项,如环境感知、条件...

    Castle ActiveRecord 2.0

    - **初始化 SessionFactory**:在程序启动时创建并初始化 SessionFactory。 - **CRUD 操作**:使用 `Save()`, `Update()`, `Delete()`, `Find()`, `FindAll()` 等方法进行数据的增删改查。 - **查询**:利用 LINQ to...

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    Java IoC讲解

    容器在运行时管理这些依赖对象的生命周期,如实例化、初始化、销毁等。 Spring框架是轻量级容器的一个很好的例子,它采用依赖注入的方式,支持声明式事务管理、远程访问、数据访问等。Spring的IoC容器是一个高度...

    uncrate:用于配置 Linux 开发环境的 Chef 手册

    此外,还有静态文件,如初始化脚本、配置文件等。 5. **Tests**:为了保证配置的正确性和一致性,Uncrate 可能包含自动化测试,如 RSpec 和 Serverspec,用于在部署前验证配置。 6. **Metadata**:Cookbook 的元...

    CocoaFundamentals.pdf

    - **属性声明:**使用@interface定义类的属性,可以设置读写权限、存储方式等。 - **方法调用:**通过消息传递的方式调用对象的方法,实现特定的功能。 5. **KVC与KVO:** - **Key-Value Coding (KVC):**允许...

    疯狂java讲义目录 电子版 pdf

    - **数组的初始化**:可以在声明时就为数组元素赋值。 - **使用数组**:通过索引访问和修改数组元素。 - **JDK 1.5 提供的 foreach 循环**:用于遍历数组或集合。 - **深入数组**: - **内存中的数组**:数组...

    React冒险

    3. **生命周期方法**:React组件有不同的生命周期阶段,每个阶段都有相应的钩子函数,如`componentDidMount`、`shouldComponentUpdate`和`componentDidUpdate`等,用于处理组件的初始化、更新和卸载。 4. **虚拟DOM...

Global site tag (gtag.js) - Google Analytics