मान लीजिए कि इस तरह परिभाषित एक फ़ंक्शन:

def composition(text : String, k : Int32) : Array(String)
  kmers = Array(String).new
  (0 .. text.size - k).each do |i|
    kmers << text[i, k]
    yield text[i, k]
  end
  return kmers
end

मैं कैसे जांचूं कि फ़ंक्शन के अंदर ब्लॉक तर्क दिया गया है या नहीं? यदि ब्लॉक तर्क दिया जाता है, तो किमीर्स प्राप्त होंगे। यदि नहीं दिया जाता है, तो किमी को स्ट्रिंग्स की एक सरणी के रूप में वापस कर दिया जाएगा।

3
Wen-Bin Luo 28 अगस्त 2016, 14:38

2 जवाब

सबसे बढ़िया उत्तर

इस तरह की जांच असंभव है, क्योंकि किसी ब्लॉक को स्वीकार करने वाली एक विधि (कहीं भी yield का उपयोग करके) बस एक अलग हस्ताक्षर है। लेकिन इसका मतलब यह भी है कि आपको चेक की जरूरत नहीं है, बस इस तरह से 2 तरीके बनाएं:

# if you want to be explicit (makes no difference):
# def composition(text : String, k : Int32, &block)
def composition(text : String, k : Int32)
  (0 .. text.size - k).each do |i|
    yield text[i, k]
  end
end

def composition(text : String, k : Int32) : Array(String)
  kmers = [] of String
  composition(text, k) do |s|
    kmers << s
  end
  return kmers
end
9
Oleh Prypin 22 अक्टूबर 2017, 01:46
3
यह ओपी के उपयोग के मामले को संभालता है, लेकिन अभी भी यह सवाल है कि यह निर्धारित करना संभव है कि कोई ब्लॉक पारित किया गया है या नहीं। है? मुझे नहीं लगता, क्योंकि किसी ब्लॉक के बिना ब्लॉक की अपेक्षा करने वाले फ़ंक्शन को कॉल करने से संकलन समय त्रुटि होती है; इसलिए रनटाइम पर अपवाद को बचाने का कोई तरीका नहीं है।
 – 
Keith Bennett
8 अगस्त 2017, 11:23

आपकी विशिष्ट स्थिति में, मैं ओलेह के उत्तर की अनुशंसा करता हूं। हालांकि, यहां एक अधिक सामान्य समाधान है जो आपको यह निर्धारित करने देता है कि कोई ब्लॉक पारित किया गया है या नहीं:

def composition(text, k, &block : String ->)
  composition(text, k, block)
end

def composition(text, k, block : (String ->)? = nil)
  kmers = [] of String
  (0 .. text.size - k).each do |i|
    s = text[i, k]
    if block
      block.call s
    else
      kmers << s
    end
  end
  kmers
end

(Proc सिंटैक्स पर अधिक जानकारी के लिए, देखें https://crystal -lang.org/reference/syntax_and_semantics/type_grammar.html#proc)

0
FnControlOption 25 अक्टूबर 2021, 22:04