Ruby中next if与next unless的区别及代码异常问题排查
Ruby中
next if与next unless的区别及问题解析 核心区别
next if <条件>:当条件为真时,直接跳过当前循环迭代,进入下一次循环。简单说:满足条件就跳过。next unless <条件>:当条件为假时,跳过当前循环迭代;只有条件为真时,才会继续执行循环体后续代码。等价于next if !<条件>,简单说:不满足条件就跳过。
你的代码问题分析
你最初的代码逻辑和需求完全搞反了:
$evm.vmdb(:ManageIQ_Providers_Vmware_InfraManager_Storage).all.each do |datastore| next if datastore.ems_id == provider.id.to_s next if datastore.id == 5 # 这里的逻辑是:如果id=5,就跳过不执行后续赋值 dialog_hash[datastore[:id]] = "#{datastore.name} on #{datastore.ext_management_system.name}" end
你想要的是只保留id为5的存储实例,也就是当id≠5时跳过,只有id=5时才执行赋值。这时候next if datastore.id ==5的逻辑刚好相反——它会把你想要保留的id=5的情况跳过,反而让id≠5的情况执行后续代码,所以不符合预期。
改成next unless datastore.id ==5后,逻辑就对了:
$evm.vmdb(:ManageIQ_Providers_Vmware_InfraManager_Storage).all.each do |datastore| next if datastore.ems_id == provider.id.to_s next unless datastore.id ==5 # 逻辑:除非id=5,否则跳过,只有id=5时才执行后续赋值 dialog_hash[datastore[:id]] = "#{datastore.name} on #{datastore.ext_management_system.name}" end
你也可以写成等价的next if datastore.id !=5,效果和next unless版本完全一致。
内容的提问来源于stack exchange,提问作者Destiny
相关产品推荐
相关产品推荐

