这是一个我无法解释的有趣案例.私人制定者看起来像'私人',但有时也有例外.常规私有方法似乎与私有setter的行为不同:
class TestClass
def do
self.foo = :bar # fine
self.baz # error
end
private
def foo=(other)
@foo = other
end
def baz
end
end
TestClass.new.do
Run Code Online (Sandbox Code Playgroud)
上面的代码设置@foo得很好,尽管被明确调用self.然后它无法调用#baz,因为它#baz是一个私有方法.
怎么了?
我正在使用Rails 4.1.0,Ruby 2.1.0和Postgres 9.3.0.0。
我试图将更改保存到一个列,该列是一个hstores数组(用ruby的话来说是一个哈希数组)。
这是产品模型中的(简化)代码,用于保存更改:
def add_to_cart_with_credits(cart)
cart.added_product_hashes << {"id" => self.id.to_s, "method" => "credits"}
# For some reason, this isn't saving (without the exclamation, as well)
cart.save!
end
Run Code Online (Sandbox Code Playgroud)
注意事项:
有什么想法我做错了吗?我没有看到错误:服务器日志显示该cart.added_product_hashes列已正确更新,但更改不会持久。
解
正如James指出的那样,<<因为它可以就地编辑数组,所以不要将记录标记为脏记录。虽然我并没有在数组列中更改hstore本身,但是除非明确地重构了属性,否则似乎不会对封闭的数组进行更改。以下代码解决了该问题:
def add_to_cart_with_credits(cart)
cart.added_product_hashes = cart.added_product_hashes + [{"id" => self.id.to_s, "method" => "credits"}]
# Now we're all good to go!
cart.save!
end
Run Code Online (Sandbox Code Playgroud)
詹姆斯还提出了一种更简洁的方法。
我已经阅读了关于全局变量的C2Wiki,我有三个关于它们的问题(在这篇文章的底部).主要问题是:如果全局变量如此糟糕,为什么Ruby会有它们?
此外,我注意到一些关于Ruby中全局变量的有趣行为,这使得它们与常规全局级常量的工作方式不同.
1.引用未定义的全局变量返回nil.引用未定义的全局常量返回NameError:
2.2.3 :001 > $THING
=> nil
2.2.3 :002 > THING
NameError: uninitialized constant THING
from (irb):2
from /Users/makerslaptop82/.rvm/rubies/ruby-2.2.3/bin/irb:15:in `<main>'
Run Code Online (Sandbox Code Playgroud)
2. irb用两者初始化$stdout并STDOUT定义.您可以重新定义$stdout,这不会影响STDOUT:
2.2.3 :001 > $stdout
=> #<IO:<STDOUT>>
2.2.3 :002 > STDOUT
=> #<IO:<STDOUT>>
2.2.3 :003 > $stdout = IO.new(6)
=> #<IO:fd 6>
2.2.3 :004 > $stdout
=> #<IO:fd 6>
2.2.3 :005 > STDOUT
=> #<IO:<STDOUT>>
Run Code Online (Sandbox Code Playgroud)
我的问题是: