2010-11-28 109 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