2015-10-26 8 views
5

byte_sizehandle_info() में समान 12 लंबाई पैटर्न की जांच करने के लिए कैसे मिलान करें और वाक्यविन्यास क्या है? क्या मैं handle_info() में दोनों पैटर्न का उपयोग कर सकता हूं, उदाहरण के लिए। सबसे पहले नई लाइन के लिए स्ट्रिंग की जांच करेगा, दूसरा byte_size के साथ? byte_size पैटर्न के बिनापैटर्न मिलान में byte_size के लिए वाक्यविन्यास क्या है?

उदाहरण कोड:

def init(_) do 
    {:ok, []} 
end 

def handle_info({:elixir_serial, serial, "\n"}, state) do 
    {:noreply, Enum.reverse(state)} 
end 

def handle_info({:elixir_serial, serial, data}, state) do 
    Logger.debug "data: #{data}" 
    {:noreply, [data | state]} 
end 

उत्तर

4

हाँ, आप दोनों पैटर्न का उपयोग कर सकते हैं, इसे एक से अधिक समारोह खंड होने का उद्देश्य है। ऊपर से नीचे तक, पहला मिलान करने वाला फ़ंक्शन खंड निष्पादित किया जाएगा।

आप 12 बाइट्स मैच के लिए, आधार पर अलग अलग द्विआधारी पैटर्न का उपयोग कर सकते है जो उत्पादन पर आप की जरूरत:

iex> <<data::bytes-size(12)>> = "abcdefghijkl" 
"abcdefghijkl" 
iex> data 
"abcdefghijkl" 

iex> <<data::size(96)>> = "abcdefghijkl" 
"abcdefghijkl" 
iex> data 
30138990049255557934854335340 

ये पैटर्न निश्चित रूप से अपने कार्य खंड में इस्तेमाल किया जा सकता है:

def handle_info({:elixir_serial, serial, <<data::bytes-size(12)>>}, state) do 
    # ... 
end 

def handle_info({:elixir_serial, serial, <<data::size(96)>>}, state) do 
    # ... 
end 

अधिक जानकारी के लिए उपलब्ध प्रकारों और संशोधकों पर जानकारी, आप h <<>> टाइप करके बिटस्ट्रिंग वाक्यविन्यास online या iex में दस्तावेज़ देख सकते हैं।

तुम भी byte_size के साथ एक साथ एक गार्ड खंड इस्तेमाल कर सकते हैं:

def handle_info({:elixir_serial, serial, data}, state) when byte_size(data) == 12 do 
    # ... 
end 
+0

मैं कैसे से आने वाली तार concat कर सकते हैं: elixir_serial जब तक राज्य पहुंच 12 लंबाई वांछित? वर्तमान में यह मेल नहीं खाता है, पिछले हैंडल_इनो() में डेटा अलग-अलग लंबाई के साथ स्ट्रिंग होता है। मैंने << राज्य :: बाइट्स-आकार (12) >> के साथ प्रयास किया है, लेकिन आउटपुट भी गलत है। – luzny

+0

मैं उस स्थान पर डेटा सहेज रहा हूं जहां यह मेरे कोड स्निपेट में Logger.debug है, क्या यह मिलान किए गए डेटा को संभालने के लिए सही जगह है? – luzny

+0

हां यह सही जगह है। यदि डेटा आकार में परिवर्तनीय है, तो मैं लंबाई से मेल नहीं खाऊंगा। –

संबंधित मुद्दे