Ruby if语句多行条件语法?

时间:2014-05-30 11:41:52

标签: ruby

嗨,所有新的ruby都是if if语句的有效语法吗?

if (verify_login_id = Login.where(params[:email_address], "active" =>1).select('id')# => [#<Login id: 767>]  
verify_admin_id = Admin.where("login_id" => verify_login_id.first.id).exists? #=> true) 
puts "trueee"
else
raise(ActiveRecord::RecordNotFound.new("Authorization is required to access this endpoint!"))
end

2 个答案:

答案 0 :(得分:1)

尽管在if语句中设置变量值在语法上是有效的,但这是非常有问题的。

它可能被错误地视为比较而不是赋值,并且在许多情况下,它是某人试图进行比较并将等于谓词==与赋值运算符=混淆的结果。这就是为什么今天很多IDE都会将这样的代码标记为警告和可能的错误。

在您的代码中,它似乎也很不必要......将其分为两个更易读的行:

verified_login = Login.where(params[:email_address], "active" =>1).select('id').first # => [#<Login id: 767>]  

if verified_login && Admin.where("login_id" => verified_login.id).exists? #=> true
  puts "trueee"
else
  raise(ActiveRecord::RecordNotFound.new("Authorization is required to access this endpoint!"))
end

更多观察 - 您对verify_login_id的分配不是ID,而是Login对象,而您对verify_admin_id的分配也不是id - 而是布尔值(和你一样)反正都没有使用它)。这可能看起来不仅仅是重点 - 但它增加了一个难以理解且无法维护的代码。

答案 1 :(得分:0)

不,它不是有效的代码。在第二行中,它包含一个无效的#-comment,它已从代码中删除了一个)。 (确切剪辑为#=>true),应为) #=>true

我已从代码中删除了注释,添加了缺少的括号,解析器似乎接受了它。我当然无法运行它。所以,尝试这个,可能工作:

if (verify_login_id = Login.where(params[:email_address], "active" =>1).select('id')
  verify_admin_id = Admin.where("login_id" => verify_login_id.first.id).exists?)
  puts "trueee"
else
  raise(ActiveRecord::RecordNotFound.new("Authorization is required to access this endpoint!"))
end

关于if中的多线条件 - 是的,这是可能的。有时直接,有时用一个小技巧。试试这个:

if (1+2 >= 
    3)
  puts "as"
end

它有效(至少在Ruby 1.9.3上)。但是,这不会:

if (1+2
    >= 
    3)
  puts "as"
end

这是因为Ruby解释器/编译器的设计内部特定。在最后一个示例中,为了使其工作,您需要通知Ruby 行尚未结束。以下示例有效:

if (1+2 \
    >= 
    3)
  puts "as"
end

请注意在有问题的行

末尾添加的\