首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ruby中做attr_accessor_with_default?

如何在ruby中做attr_accessor_with_default?
EN

Stack Overflow用户
提问于 2011-08-14 02:37:27
回答 5查看 14.4K关注 0票数 20

我在rails模型中使用attr_accessor_with_default的一些代码现在给了我一个弃用警告,告诉我“改用attr_accessor_with_default!”

因此,考虑到ruby 1.9.2中可能有一个新特性使attr_accessor可以处理默认值,我搜索了一下,但我没有看到这一点。不过,我确实看到了一堆重写attr_accessor来处理默认值的方法。

这就是他们告诉我“使用Ruby”的意思吗?或者我现在应该编写完整的getter/setter?还是有什么我找不到的新方法?

EN

回答 5

Stack Overflow用户

发布于 2012-01-19 05:51:07

This apidock page建议只在initialize方法中执行此操作。

代码语言:javascript
复制
class Something
  attr_accessor :pancakes

  def initialize 
    @pancakes = true
    super
  end
end

别忘了调用super,特别是在使用ActiveRecord或类似的代码时。

票数 32
EN

Stack Overflow用户

发布于 2011-12-27 19:31:51

由于您可能非常了解您的数据,因此假设nil不是有效值是完全可以接受的。

这意味着您可以取消after_initialize,因为它将对您创建的每个对象执行。正如一些人指出的那样,这对性能(可能)是灾难性的。此外,在Rails 3.1中,无论如何都不推荐使用示例中的内联方法。

为了“改用Ruby”,我会采用这种方法:

代码语言:javascript
复制
attr_writer :pancakes

def pancakes
  return 12 if @pancakes.nil?
  @pancakes
end

所以,稍微修改一下Ruby的魔力,然后编写你自己的getter。毕竟,这正是你想要实现的目标,而且它足够好和简单,任何人都可以理解。

票数 5
EN

Stack Overflow用户

发布于 2014-07-18 01:27:33

这是一个古老的问题,但普遍的问题仍然出现-我发现自己在这里。

其他答案多种多样且有趣,但我在初始化数组时发现了所有这些答案的问题(特别是因为我希望能够在实例上调用initialize之前在类级别使用它们)。我在以下方面取得了成功:

代码语言:javascript
复制
attr_writer :pancakes

def pancakes
  @pancakes ||= []
end

如果使用=而不是||=,您会发现<<操作符无法将第一个元素添加到数组中。(创建了一个匿名数组,并为其赋值,但从未将其赋值回@pancake。)

例如:

代码语言:javascript
复制
obj.pancakes
#=> []
obj.pancakes << 'foo'
#=> ['foo']
obj.pancakes
#=> [] 
#???#!%$#@%FRAK!!!

由于这是一个相当微妙的问题,可能会引起一些困惑,我认为在这里值得一提。

例如,如果您想要缺省为false,则需要为bool更改此模式:

代码语言:javascript
复制
attr_writer :pancakes

def pancakes
  @pancakes.nil? ? @pancakes = false : @pancakes
end

尽管您可能会争辩说,在处理bool时,赋值并不是严格必要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7052509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档