3

例如,这需要 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
4

6 回答 6

7

我不确定为什么您认为空间如此宝贵,以至于您的原始代码“太多”。给你的代码空间来呼吸,让它占据它需要的空间。为了“节省空间”而变得过于棘手是一种虚假的经济。最重要的是你的代码是可读和可理解的。您的原始代码对我来说看起来很棒。

于 2012-07-05T01:03:17.797 回答
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
于 2012-07-05T01:54:53.577 回答
1

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

puts 'error' || return if something_else
于 2012-07-05T01:04:14.033 回答
1

在这种特定情况下,return没有值将返回nil; 因为这恰好也是 的返回值puts,所以您可以通过以下方式获得相同的效果:

return puts "error" if something_else
于 2012-07-05T01:46:19.650 回答
0

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

于 2012-07-05T01:06:35.610 回答
0

我建议永远不要使用;加入语句,它往往是不可读的。但是还有其他方法,两个想法:第一个,joinerror(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")
于 2012-07-05T07:13:47.897 回答