/ / रूबी सरणी पैटर्न मिलान - रूबी, हैस्केल, कार्यात्मक-प्रोग्रामिंग

रूबी सरणी पैटर्न मिलान - रूबी, हैकसेल, कार्यात्मक-प्रोग्रामिंग

मैं रूबी में प्रोग्रामिंग के लिए नया हूं और मैंने देखा है कि इसमें कुछ कार्यात्मक क्षमताएं हैं। सोच रहा था कि क्या एरेज़ पर पैटर्न मैच करने का कोई तरीका है; मैं निम्नलिखित को पूरा करने के लिए देख रहा हूँ:

split_string = str.split("_", 2)
fst = repo_branch_split.first
snd = repo_branch_split.second

एक हास्केल की तरह तरीके से:

split_string@(fst : snd) = str.split("_", 2)

माणिक में भी कुछ ऐसा ही है या नहीं?

उत्तर:

जवाब के लिए 9 № 1

यह रूबी में एक समानांतर असाइनमेंट है। आप चर को इस तरह से असाइन कर सकते हैं

fst, snd = str.split("_", 2)

बाकी सरणी को एकल चर में असाइन करके आप हास्केल से सिर / पूंछ का व्यवहार भी प्राप्त कर सकते हैं:

head, *tail = "foo_bar_baz".split("_")
# head => "foo"
# tail => ["bar", "baz"]

बिना स्टार के tail, यह केवल असाइन करेगा bar स्ट्रिंग और baz "गायब" हो जाएगा।


जवाब के लिए 2 № 2

बहुत ज्यादा मेल खाता हुआ। प्रयत्न

fst, snd = str.split("_", 2)

उत्तर № 3 के लिए 1

@smefju का जवाब अच्छा है, लेकिन मैं सिर्फ एक ऐसा तरीका साझा करूंगा जो आप और भी अधिक कर सकते हैं विनाशकारी असाइनमेंट माणिक का उपयोग करना

def foo &f
# watch the array get destructured in the block below
f.call [1,2,3,4,5], :sweet, :candy
end

# first block param is array, so we can destructure it if you want
foo do |(x,*xs),y,z|
puts %Q{
x: #{x}
xs: #{xs}
y: #{y}
z: #{z}
}
end

उत्पादन

x: 1
xs: [2, 3, 4, 5]
y: sweet
z: candy

यह सभी प्रकार से उपयोगी है

hash = {a: 1, b: 2, c: 3}
hash.reduce({}) do |acc,(k,v)|
puts %Q{
acc: #{acc}
k: #{k}
v: #{v}
}
acc.merge(k => v * v)
end

उत्पादन

acc: {}
k: a
v: 1

acc: {:a=>1}
k: b
v: 2

acc: {:a=>1, :b=>4}
k: c
v: 3

=> {:a=>1, :b=>4, :c=>9}

एरो थ्रो को नष्ट करने के अलावा, रूबी की इस विभाग में बहुत कमी है। आप "सत्य हैश को नष्ट नहीं कर सकते हैं और वास्तविक जैसी कोई चीज नहीं है पैटर्न मिलान रूबी में