如果something_is_true,do_two_simple_things的Ruby习语

时间:2012-07-05 00:59:38

标签: ruby

例如,这需要4行,这对于这样一个简单的操作来说空间太大了:

if something_is_true
  puts 'error'
  return
end

这是一个单行,但看起来很尴尬。

if something_is_true; puts 'error'; return; end

我们可以做类似的事吗

# it would be great if this would work because it is short and readable
puts 'error' and return if something_is_true

6 个答案:

答案 0 :(得分:7)

我不确定为什么你认为空间太贵了,原来的代码太“太多了”。让您的代码室呼吸,让它占用所需的空间。为了“节省空间”而变得过于棘手是一种虚假的经济。最重要的是您的代码可读且易懂。您的原始代码对我来说很棒。

答案 1 :(得分:4)

我同意@NedBatchelder您原来的代码可能是最好的。其他人指出,在您的特定示例中,您可以使用return puts 'error'

尽管如此,为了学习,可以使用括号对多个语句进行分组,因此在您只能使用一个语句的地方使用少量语句。你说:

# it would be great if this would work because it is short and readable
puts 'error' and return if something_is_true

你可以这样做:

(puts 'error'; return) if something_is_true

答案 2 :(得分:1)

这有点糟糕,但我认为它会起作用,因为puts返回nil:

puts 'error' || return if something_else

答案 3 :(得分:1)

在这种特定情况下,没有值的return将返回nil;因为这恰好也是puts的返回值,你只需得到相同的效果:

return puts "error" if something_else

答案 4 :(得分:0)

总有一天,你可能会关心你可以在一行代码中花费多少个周期。我会使用if-end块,因为它很简单,清晰,并且......你知道,这就是它的用途。

答案 5 :(得分:0)

我建议永远不要使用;来加入语句,它往往是不可读的。但仍然有其他方法,两个想法:第一个,加入error(msg, return_value = nil)return

return(error("Message")) if something_is_true

return(error("Message", value_to_be_returned)) if something_is_true

第二个,在Ruby中,使用异常来表示问题是惯用的,所以你可以写出这个完美惯用的单行代码:

raise MyException.new("human explanation of the error") if condition

在作业中使用相同的想法:

link = doc.at_css(".content a.link") or raise MyException.new("msg")