Ruby 为什么有定义?州
我在我的sinatra应用程序中遇到了一个非常奇怪的问题。重要的代码部分如下: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
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来说是正确的。但我还是不明白这到底是怎么发生的。