Ruby 为什么有定义?州

Ruby 为什么有定义?州,ruby,sinatra,mongomapper,Ruby,Sinatra,Mongomapper,我在我的sinatra应用程序中遇到了一个非常奇怪的问题。重要的代码部分如下: puts "url: #{url.inspect}" is_music_post = nil is_video_post = nil is_music_post = defined?(url.music_post_id) != nil is_video_post = defined?(url.video_post_id) != nil puts "vid post: #{is_video_post}" puts

我在我的sinatra应用程序中遇到了一个非常奇怪的问题。重要的代码部分如下:

puts "url: #{url.inspect}"

is_music_post = nil
is_video_post = nil

is_music_post = defined?(url.music_post_id) != nil
is_video_post = defined?(url.video_post_id) != nil

puts "vid post: #{is_video_post}"
puts "music post: #{is_music_post}"
URL对象来自mongo mapper。它们看起来像这样:

obejct 1

#

在这里,它按预期工作,并返回:

vid post: false
music post: true
obejct 2

#

在这里它变得奇怪,我期望视频帖子为真,音乐帖子为假,但我得到:

vid post: true
music post: true
obejct 3

#

她是一样的,两种价值观都是正确的

vid post: true
music post: true
WFT

所以我猜某处某物具有这种状态。那我怎么能每次都强迫它重新评估呢

我的系统

ruby-VRuby 2.0.0p353(2013-11-22修订版43784)[x86_64-linux]

更新


我认为延迟加载的解释可能是正确的。如果这是真的,我如何在这种情况下禁用它

从外观上看,MongoMapper正在懒洋洋地创建属性,
已定义?
没有检查字段的值,而是检查字段是否已定义,因此您需要找到更好的测试来满足预期目标,虽然我不知道它是否被实施过

第一次创建对象时,它有一个
music post
,因此它得到一个
true
,但
vid post
没有。第二次您不使用music post字段,但它是用最后一个对象创建的,因此您得到
true
true
。对象3也将因此获得
true
true


试着把第二个物体放在第一位。如果
vid post
true
,而
music post
false,你就会知道这与属性的定义方式有关。

你能打印
定义的内容吗?(url.music\u post\u id)
提供给你,这会给你一个提示,告诉你发生了什么当它的返回方法为真时,为零或为零,当它为假时,为零,无意外如果它不是意外的,那么我不理解这个问题没有意外,我的意思是它们与真值和假值对应,我通过改变对象顺序来测试你的想法,你的权利在这件事上对vid post来说是正确的。但我还是不明白这到底是怎么发生的。