2009-07-29 69 views
3

是否可以使用ruby在內聯語句中定義塊?事情是這樣的:你可以用ruby定義一個塊嗎?

tasks.collect(&:title).to_block{|arr| "#{arr.slice(0, arr.length - 1).join(", ")} and #{arr.last}" } 

取而代之的是:

titles = tasks.collect(&:title) 
"#{titles.slice(0, titles.length - 1).join(", ")} and #{titles.last}" 

如果說tasks.collect(&:title).slice(0, this.length-1)你怎麼能「這個」是指傳遞給切片全陣列()?

基本上我只是在尋找一種方法將從一個語句返回的對象傳遞給另一個語句,而不一定會遍歷它。

回答

4

你有點混淆,將返回值傳遞給方法/函數並在返回的值上調用方法。做你所描述的方法是這樣的:

lambda {|arr| "#{arr.slice(0, arr.length - 1).join(", ")} and #{arr.last}"}.call(tasks.collect(&:title)) 

如果你想這樣做,你正在嘗試的方式,最接近的匹配是instance_eval,它可以讓你的對象的上下文中運行的模塊。所以那將是:

tasks.collect(&:title).instance_eval {"#{slice(0, length - 1).join(", ")} and #{last}"} 

但是,我不會這樣做,因爲它比替代選項更長和更不可讀。

1

我不知道你想要做什麼,但:

如果你說tasks.collect(&:標題).slice(0,this.length - 1)如何你讓'this'引用傳遞給slice()的完整數組?

使用負數:

tasks.collect(&:title)[0..-2] 

此外,在:

"#{titles.slice(0, titles.length - 1).join(", ")} and #{titles.last}" 

你有什麼奇怪你報價的時候,我想。

+0

謝謝,好了解的負數。 – bwizzy 2009-07-29 15:17:29

1

我真的不明白,爲什麼你會想,但你可能會增加,需要一個塊中的Ruby類的功能,並將自身作爲一個參數...

class Object 
    def to_block 
    yield self 
    end 
end 

此時你將能夠撥打:

tasks.collect(&:title).to_block{|it| it.slice(0, it.length-1)} 

當然,修改對象類不應該掉以輕心當與其他圖書館合併有可能引起嚴重的後果。

+0

有沒有辦法做到這一點,產生自我內聯? – bwizzy 2009-07-29 15:18:09

0

雖然這裏有很多很好的答案,也許你在一個客觀的角度來看待的東西多是這樣的:

class Array 
    def andjoin(separator = ', ', word = ' and ') 
    case (length) 
    when 0 
     '' 
    when 1 
     last.to_s 
    when 2 
     join(word) 
    else 
     slice(0, length - 1).join(separator) + word + last.to_s 
    end 
    end 
end 

puts %w[ think feel enjoy ].andjoin # => "think, feel and enjoy" 
puts %w[ mitchell webb ].andjoin # => "mitchell and webb" 
puts %w[ yes ].andjoin # => "yes" 

puts %w[ happy fun monkeypatch ].andjoin(', ', ', and ') # => "happy, fun, and monkeypatch" 
相關問題