2011-07-28 29 views
8

Olası Çoğalt:
Ruby block and unparenthesized argumentsYakut Blok sözdizimi hatası

Ben bu sözdizimi hatası anladığımdan emin değilim. Rails uygulamasında bazı dosya yüklemelerini yönetmek için Carrierwave kullanıyorum ve yöntemlerden birine yanlış bir şekilde geçiyor gibi görünüyor.

İşte Carrierwave Docs yılında örnek:

version :thumb do 
    process :resize_to_fill => [200,200] 
end 

İşte buydu:

version :full { process(:resize_to_limit => [960, 960]) } 
version :half { process(:resize_to_limit => [470, 470]) } 
version :third { process(:resize_to_limit => [306, 306]) } 
version :fourth { process(:resize_to_limit => [176, 176]) } 

Yukarıdaki çalışmıyor, ben syntax error, unexpected '}', expecting keyword_end olsun. İlginçtir ki, kusursuzca aşağıdaki çalışır:

version :full do process :resize_to_limit => [960, 960]; end 
version :half do process :resize_to_limit => [470, 470]; end 
version :third do process :resize_to_limit => [306, 306]; end 
version :fourth do process :resize_to_limit => [176, 176]; end 

Yani, benim sorum, ben bu durumda do...end ancak parantez kullanarak bir blok iletebilirsiniz neden?

Teşekkürler!

+0

Bu 'do' ile parantez ile çalışır each'' geçirilen [Kod bloğunun yineleniyor değil - '' (ruby)] (http://StackOverflow.Com/q/6718340/), [Blok tanımı - diş telleri ve 'do'-'end' arasındaki fark?] (http://StackOverflow.Com/q/6179442 /), [Yakla bitmeden Ruby çok satırlı blok] (http://StackOverflow.Com/q/3680097/), ['do' bloğu kullanılarak parantez {} '] (http: //) StackOverflow.Com/q/2122380/), [Ruby'deki bu kod kodlama stillerinin farkı veya değeri nedir?] (Http://StackOverflow.Com/q/533008/) ve [Ruby bloğu ve saydam olmayan argümanlar] (http : //StackOverflow.Com/q/420147/). –

cevap

14

bu deneyin:

version(:full) { process(:resize_to_limit => [960, 960]) } 
version(:half) { process(:resize_to_limit => [470, 470]) } 
version(:third) { process(:resize_to_limit => [306, 306]) } 
version(:fourth) { process(:resize_to_limit => [176, 176]) } 

Bir öncelik sorun var. { } bloğu, bir do...end bloğundan daha sıkı ve bir yöntem çağrısından daha sıkı bir şekilde bağlanır; Sonuç, Ruby'nin bir bloğa argüman olarak bir blok sağlamaya çalıştığınızı düşündüğünü ve hayır diyor.

Daha temiz bir bakın veya karşılaştırarak muhtemelen daha bildik bir örnek aşağıdaki (?):

[1, 2, 3].inject 0 { |x, y| x + y } 
[1, 2, 3].inject(0) { |x, y| x + y } 
+0

Tam olarak öyle. Hızlı açıklama için teşekkürler! – Andrew