如何在一行中写出if语句?

时间:2013-05-05 15:30:38

标签: ruby-on-rails ruby-on-rails-3

@community_topic.comment_threads.last.created_at不是last_comment_time时,我想将@community_topic.comment_threads.last.created_at设置为nil 当它为零时,我想设置commentable.created_at

我怎么写?我试过这个,但我有错误回复:(

last_comment_time = @community_topic.comment_threads.last.created_at || commentable.created_at

2 个答案:

答案 0 :(得分:3)

我个人认为这比三元运算符更具可读性。

last_comment_time = 
  if @community_topic.comment_threads.last.created_at.nil?
    commentable.created_at
  else
    community_topic.comment_threads.last.created_at
  end

如果你牺牲清晰度,更多的线条不一定是坏事。

至于你的代码:

last_comment_time = @community_topic.comment_threads.last.created_at || commentable.created_at

这是最好的方法。您很可能会收到错误,因为.last正在返回nil(当调用范围内没有记录时会发生这种情况)。因此,在这种情况下,您可能在@community_topic下没有任何线程。

Ruby提供了一个名为try的方法,如果在Nil :: NilClass上调用该方法(而不是抛出NoMethodError异常),它将调用一个方法并返回nil

这可以在你的代码行中使用:

last_comment_time = @community_topic.comment_threads.last.try(:created_at) || commentable.created_at

因此last将返回nil,然后尝试调用created_at。由于created_at使用try在nil上调用,因此它也会返回nil,因此变量将设置为commentable.created_at

答案 1 :(得分:1)

last_comment_time = @community_topic.comment_threads.last.created_at.nil? ? commentable.created_at : @community_topic.comment_threads.last.created_at

有趣的是,Stack Overflow上有一个conditional operator标记,解释了条件运算符的工作原理:

“条件运算符,由字符?和:表示,是三元运算符,是几种编程语言中基本条件表达式语法的一部分。它通常也称为三元运算符或内联运算符。它的用法如下:(条件)?(值......)“

:然后代表else