هل يمكنني تعطيل قوائم الطباعة من أعداد صحيحة صغيرة كأسلاك في قذيفة إرلانج؟
-
23-09-2019 - |
سؤال
قذيفة Erlang "تخمين" ما إذا كانت قائمة معينة عبارة عن سلسلة قابلة للطباعة وتطبعها بهذه الطريقة للراحة. هل يمكن تعطيل هذه "الراحة"؟
المحلول
يمكنك تعطيل مثل هذا السلوك shell:strings/1
وظيفة بدءا من erlang r16b.
فقط تذكر أن هذا هو الخيار العالمي لجميع قذائف العقدة ، وقد يكون من الحكمة إعادتها بعد الانتهاء من اللعب هو قذيفة في العقد الحية الأطول.
نصائح أخرى
لا أعرف ما إذا كان من الممكن تغيير السلوك الافتراضي للقذيفة ، ولكن يمكنك على الأقل تنسيق إخراجك بشكل صحيح ، باستخدام IO: تنسيق.
هنا مثال:
1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok
وبما أن القشرة هي فقط للتجربة / الصيانة ، io:format()
يجب أن يكون على الأقل بما يكفي لتطبيقك الحقيقي. ربما يجب عليك أيضًا التفكير في كتابة طريقة التنسيق/الطباعة الخاصة بك ، على سبيل المثال formatPerson()
أو شيء من هذا القبيل ، الذي يتصرف كل شيء بشكل جيد.
أميل إلى القيام بذلك عن طريق إعداد ذرة إلى قائمتي في القشرة.
علي سبيل المثال:
Eshell V5.7.4 (abort with ^G)
1> [65,66,67].
"ABC"
2> [a|[65,66,67]].
[a,65,66,67]
يمكن أن يكون أيضًا [A ، 65،66،67] ، بالطبع. ولكن [a | fun_that_returns_a_list ()] سوف يطبعون "الشيء الصحيح (ish) معظم الوقت"
اعتبارا من إرلانغ/OTP R16B, ، يمكنك استخدام الوظيفة شل: سلاسل/1 لتشغيل هذا أو إيقاف تشغيله. لاحظ أنه يؤثر أيضًا على طباعة الأشياء التي تهدف في الواقع إلى أن تكون سلاسل ، مثل "foo"
في المثال التالي:
1> {[8,9,10], "foo"}.
{"\b\t\n","foo"}
2> shell:strings(false).
true
3> {[8,9,10], "foo"}.
{[8,9,10],[102,111,111]}
لا ، لا توجد طريقة لتعطيلها. أفضل بديل أجده هو إما طباعة القيمة بشكل صريح في الاستعلام (مع io:format
) أو بعد الحقيقة: io:format("~w\n", [v(-1)])
.
لا أعتقد أنه يمكنك منعه. يبدو أن ذرة مسبقة مثل kludge - إنها تغير السلسلة الأصلية.
عادةً ما أستخدم القوائم: Flatten (سلسلة) لإجبارها على سلسلة - خاصةً عودة IO_LIB: Format () لا يطبع دائمًا كسلسلة. باستخدام القوائم: Flatten () على ذلك يجعلها واحدة.
يمكنني استخدام ما يلي "على الطراز C":
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
المشكلة هي أن السلسلة ليست نوعًا في إرلانج. السلسلة هي مجرد قائمة من الأعداد الصحيحة ، لذلك لا توجد طريقة لتمييز القذيفة على سلسلة قابلة للطباعة من قائمة عامة. لا أعرف ما إذا كانت هذه الإجابة على سؤالك.