سؤال

"abc def ".split(" ")

عائدات

["abc", "def"]

وهكذا ، كنت أتوقع:

["a", "b", "c", " ", "d", "e", "f", " "].split(" ")

لكي ترجع

[["a", "b", "c"], ["d", "e", "f"]]

لكنها عادت

[["a", "b", "c"], ["d", "e", "f"], []]

قرأت من خلال الكود المصدري القيام بالتقسيم في Active_support/core_ext/array/coliting.rb (أنا أستخدم ActiveSupport 4.0.0 مع Ruby 2.0.0-P247). يمكنك العثور على سطرين من المستند هنا: http://api.rubyonrails.org/classes/array.html#method-i-split والرمز هو ما يلي:

def split(value = nil, &block)
    inject([[]]) do |results, element|
      if block && block.call(element) || value == element
        results << []
      else
        results.last << element
      end

      results
    end
  end

وهذا ما يفسر كيف يفعل الانقسام.

الآن ، هل هذا هو السلوك المقصود أم أن حشرة Activesupport؟

هل كانت مفيدة؟

المحلول

ربما يكون هذا السلوك المقصود وليس خطأ. وفقا للوثائق ، تقسيم صفيف:

يقسم الصفيف إلى واحد أو أكثر من الطوائف الفرعية بناءً على قيمة تحديد أو نتيجة كتلة اختيارية.

هذا لا يجعل أي ضمانات حول المساحات المتجاورة أو الرائدة.

من ناحية أخرى ، توثيق روبي الأساسي إلى عن على String#split تنص على:

إذا كان النمط عبارة عن سلسلة ، فسيتم استخدام محتوياته كمحدد عند تقسيم STR. إذا كان النمط مساحة واحدة ، فسيتم تقسيم STR على مساحة بيضاء ، مع تجاهل المسافة البيضاء الرائدة وتشغيل أحرف المسافة البيضاء المتجاورة.

كما ترون ، فإن السلوك الذي تتوقعه يعمل فقط مع المساحة البيضاء ، وليس لأي سلسلة فقط.

 "abc ccc def ".split("c")
 => ["ab", " ", "", "", " def "]

عند تقسيم صفيف ، لم يعد مفهوم "المسافة البيضاء" منطقية حقًا. لذلك أعتقد أن السلوك معقول ، إذا ربما يكون غير بديهي في البداية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top