2010-11-28 67 views
6

我喜欢用Ruby编写这么多的原因之一是因为它非常有能力通过一个衬垫实现很多。优雅的红宝石一个衬垫

我喜欢:

@sentence = @sentence.split(' ').map!{|x| x = x[0..0].upcase << x[1..-1] }.join(' ') 

它利用每个字,这还不是最惊人的,但相当有效率的第一个字母。

什么是你已经看到或用Ruby写的最优雅的一个班轮?

+2

请编辑和纪念这个作为一个社区的wiki,以避免它关闭是主观的(没有真正的答案):) – Matchu 2010-11-28 17:07:06

+0

是很久以前删除标记问题社区维基的能力。看到这个:http://meta.stackexchange.com/questions/392/should-the-community-wiki-police-be-shut-down – 2010-11-28 17:10:37

回答

28

您发布的oneliner:

@sentence = @sentence.split(' ').map!{|x| x = x[0..0].upcase << x[1..-1] }.join(' ') 

但你误会关于Ruby有两件事情。

首先,在地图调用中说x=不影响地图调用之外的任何内容。该数组元素的新值是该块返回的

其次,您不需要使用<<对第一个字符串进行变异 - 创建新字符串的连接(使用+)是一个更好的选择。

第三,map!直接对由split返回的数组进行更改。你想要做的是保持该数组不变(即使它不改变程序语义),并使用map返回带有映射结果的新数组。

所以,你应该写:

@sentence = @sentence.split(' ').map{|x| x[0..0].upcase + x[1..-1] }.join(' ') 

现在的说法x[0..0].upcase + x[1..-1]还是很钝。也许你应该用capitalize方法替换它,它已经将字符串的第一个字母改为大写。 (请注意,它也downcases所有其他的可能是也可能不是你想要的。)

@sentence = @sentence.split(' ').map{|x| x.capitalize }.join(' ') 

我可能会使用gsub!改变就地部分字符串,但是这可能有点钝角:

@sentence.gsub!(/\S+/){|x| x.capitalize} 

还有一件事。如果一个块的唯一目的是调用传递给块对象上的一个方法,你可以做到以下几点:

@sentence = @sentence.split(' ').map(&:capitalize).join(' ') 

或修改我的gsub!版本:

@sentence.gsub!(/\S+/,&:capitalize) 
0

嗯,我前几天写了一篇,但是不能用它作为答案,因为当时问题已经关闭了。 如果字符串不在那里,它用一个字符串替换文件的第一行。

我希望有人提高了这其中也:

ruby -i.bak -pe "print ($_!~/string/ && $.<2) ? \"string\n\":''" filename.txt 
0

斐波那契序列发生器:

def fib n;n==0?[0]:n==1?[0,1]:(2..n-1).inject([0,1]){|a|a<<(a[-1]+a[-2])};end 

一样:

def fib n;n<2?(0..n-1).to_a():(2..n-1).inject([0,1]){|a|a<<(a[-1]+a[-2])};end 
0

打开一个文件,写微博,和关闭它在一条线上:

File.open(File.join(Rails.root, 'lib', 'assets', 'file.txt'), 'a+') {|f| f.write("stuff"+"\n" } 

大多数我最好的Ruby的单行每天脚本利用andunlessif&&等等,如:

puts "x is nil!" if x.nil? 

您可以使用unlessif互换,但unless显著提高可读性当正确使用时:

puts "bad input type!" unless ["bs", "cf", "is"].include?(type) 

通常情况下,最好的红宝石单线最终在两到三行

def try_first(actual_index) 
    x = [get_header(actual_index, 0), get_data(actual_index, 0)] unless get_header(actual_index, 0).blank? 
    x = try_second(actual_index) if x[0].blank? #blank is a rails method, detects nil and empty strings and empty containers ([]) I think too 
    puts "x is nil!" if x.nil? 
    x 
end 

我说的俏皮话由几个单行因为该方法:单行与变量Ruby的“价”制度(nilfalse是唯一的“底片”)共同作用下,往往结合本身并不比我的代码中的其他位置单行一行。我的很多方法虽然只是一条线:

def get_all_coords(type) 
    eval("@#{type}_coords") 
end 

这就是你真正开始变得优雅。将代码分解成单独的方法。单线法是完美的。

0

肯定的斐波纳契数!

def fib(n, t = n < 2 ? n : fib(n-1) + fib(n-2)) t; end