例如,这需要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
答案 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")