如果......任何......做...结束...结束如何缩进

时间:2014-01-17 18:20:01

标签: ruby indentation

我是ruby的新手,我想知道如何缩进这段代码:

if a.any? do |blah|
name = blah[:name][/.* (.*)/, 1]
name = convert_name(name)
text = "#{name}#{blah[:value]}"
text == "b2"
end
puts "found"
exit 1
end

5 个答案:

答案 0 :(得分:3)

像这样:

if(a.any? { |blah| text = "#{blah[:name]}#{blah[:value]}"; text == "b2"})
  puts "found"
  exit 1
end

如果您的any?区块很长,请执行以下操作:

result = a.any? do |blah| 
  text = "#{blah[:name]}#{blah[:value]}"
  text == "b2"
  ...
end
if(result)
  puts "found"
  exit 1
end

答案 1 :(得分:3)

部分挑战是干净地容纳ifany?块,因为两者都以end终止。那么,区分它们的一种方法是使用内部块的大括号,以使其更清楚:

if a.any? { |blah|
    name = blah[:name][/.* (.*)/, 1]
    name = convert_name(name)
    text = "#{name}#{blah[:value]}"
    text == "b2" }
then
  puts "found"
  exit 1
end

感谢Cary Swoveland建议then

答案 2 :(得分:3)

我可能会将搜索逻辑扔进一个lambda:

are_wanted = lambda do |blah|
  name = blah[:name][/.* (.*)/, 1]
  name = convert_name(name)
  text = "#{name}#{blah[:value]}"
  text == "b2"
end

然后,一旦它有一个名称,以便我们可以一眼就知道它是什么,if变得美观和可读:

if a.any?(&are_wanted)
  puts "found"
  exit 1
end

当你最终得到一个复杂的Enumerable管道时,我觉得这个技术非常有用,例如:

pull_em_apart        = lambda { ... }
the_good_ones        = lambda { ... }
put_em_back_together = lambda { ... }
array.map(&pull_em_apart)
     .select(&the_good_ones)
     .map(&put_em_back_together)

lambda s多于一行时,比一大堆内联块更容易理解。

答案 3 :(得分:2)

我写的是:

if a.any? { |blah| (blah[:name] + blah[:value]) == "b2" }
  puts "found"
  exit 1
end

或者:

if a.any? { |blah| blah.values_at(:name, :value).join == "b2" }
  puts "found"
  exit 1
end

实际测试足够短,可以在一行中完成。

通常我们在块返回值或单行时使用大括号({})。

插入另一个字符串中的两个字符串只是为了加入它们是臭的。只是将它们连接起来;你正在做的事情更明显。


如果您关注如何明确缩进,请考虑以下事项:

if a.any? do |blah|
    name = blah[:name][/.* (.*)/, 1]
    name = convert_name(name)
    text = "#{name}#{blah[:value]}"
    text == "b2"
  end
  puts "found"
  exit 1
end

any?块应缩进比if块的内容缩进,以便在视觉上将它们分开。除了缩进...呃... any? 的代码块应重构为单行仍然。

答案 4 :(得分:0)

另一种选择:

begin
  puts "found"
  exit 1
end if a.any? do |blah|
  name = blah[:name][/.* (.*)/, 1]
  name = convert_name(name)
  text = "#{name}#{blah[:value]}"
  text == "b2"
end