我是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
答案 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)
部分挑战是干净地容纳if
和any?
块,因为两者都以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