SORU
21 AĞUSTOS 2013, ÇARŞAMBA


Ruby - zarif bir dizi değişken bir dizi değil zaten dönüştürmek

Bir dizi göz önüne alındığında, tek bir öğe, ya da nil, bir dizi elde - son iki eleman tek bir dizi olması ve boş bir dizi olmuştur.

Ben Ruby bu şekilde işe yarayacağını yanlışlıkla düşündüm:

[1,2,3].to_a  #= [1,2,3]     # Already an array, so no change
1.to_a        #= [1]         # Creates an array and adds element
nil.to_a      #= []          # Creates empty array

Ama gerçekten ne olduğunu:

[1,2,3].to_a  #= [1,2,3]         # Hooray
1.to_a        #= NoMethodError   # Do not want
nil.to_a      #= []              # Hooray

Bu yüzden bunu çözmek için benim yapabileceğim başka bir yöntem kullanmanız gerekir, ya da meta benim için bir seçenek değildir kullanacağım tüm sınıflar - to_a yöntemi değiştirerek ya da program.

Bir Yöntem:

result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))

Sorun biraz karışık bir durum. Bunu yapmanın daha zarif bir yolu var mı? (Eğer bu sorunu çözmek için Ruby-ish yolu ise çok memnun olurdum)


Ne bu uygulamalar var mı? Neden bir dizi dönüştürmek bile?

Raylar' ActiveRecord,, user.posts ki arama ya da mesajların bir dizi, tek bir post dönmek, ya da sıfır olacak. Bu sonuçları üzerinde çalışma yöntemlerini yazarken, en kolay yöntem sıfır, bir veya birçok unsuru olabilecek bir dizi alacak varsayalım. Örnek yöntem:

current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}

CEVAP
21 AĞUSTOS 2013, ÇARŞAMBA


[*foo] Array(foo) çoğu zaman çalışır, ama karma gibi bazı durumlarda, bozar.

Array([1, 2, 3])    # => [1, 2, 3]
Array(1)            # => [1]
Array(nil)          # => []
Array({a: 1, b: 2}) # => [[:a, 1], [:b, 2]]

[*[1, 2, 3]]    # => [1, 2, 3]
[*1]            # => [1]
[*nil]          # => []
[*{a: 1, b: 2}] # => [[:a, 1], [:b, 2]]

Hatta karma için çalışan düşünebildiğim tek yol bir yöntem tanımlamaktır.

class Object; def ensure_array; [self] end end
class Array; def ensure_array; to_a end end
class NilClass; def ensure_array; to_a end end

[1, 2, 3].ensure_array    # => [1, 2, 3]
1.ensure_array            # => [1]
nil.ensure_array          # => []
{a: 1, b: 2}.ensure_array # => [{a: 1, b: 2}]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eisleyhead

    eisleyhead

    11 Ocak 2006
  • GirlSanctuaryBlog

    GirlSanctuar

    28 Aralık 2011
  • Samvith V Rao

    Samvith V Ra

    20 EKİM 2006