يمكن/ينبغي ضمني التحويل من T إلى الخيار[T] إضافة/إنشاؤها في سكالا?

StackOverflow https://stackoverflow.com/questions/1746359

  •  20-09-2019
  •  | 
  •  

سؤال

هذه الفرصة لجعل الأمور قليلا أكثر كفاءة (من أجل prorammer):أجد أنه يحصل قليلا ممل الحاجة إلى التفاف الأشياء في Some, مثلا Some(5).ماذا عن شيء مثل هذا:

implicit def T2OptionT( x : T) : Option[T] = if ( x == null ) None else Some(x)
هل كانت مفيدة؟

المحلول

ويمكنك أن تفقد بعض سلامة نوع وربما سبب الارتباك. على سبيل المثال:

  val iThinkThisIsAList = 2 
  for (i <- iThinkThisIsAList) yield { i + 1 }

وI (لأي سبب كان) أنه كان لديه قائمة، ولم ننشغل من قبل المترجم عندما كرر أكثر من ذلك لأنه تم تحويل السيارات إلى الخيار [الباحث].

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

نصائح أخرى

ملحوظة التي يمكن أن تستخدم صريح نمط الضمني الذي من شأنه تفادي الخلط والحفاظ على مقتضب التعليمات البرمجية في نفس الوقت.

وما أعنيه ضمني صريح هو بدلا من أن يكون التحويل المباشر من T إلى Option[T] هل يمكن أن يكون التحويل إلى كائن المجمع الذي يوفر وسيلة للقيام التحويل من T إلى Option[T].

class Optionable[T <: AnyRef](value: T) {
  def toOption: Option[T] = if ( value == null ) None else Some(value)
}

implicit def anyRefToOptionable[T <: AnyRef](value: T) = new Optionable(value)

... أنا قد تجد اسما أفضل لذلك من Optionable، ولكن الآن يمكنك كتابة التعليمات البرمجية مثل:

val x: String = "foo"
x.toOption // Some("foo")

val y: String = null
x.toOption // None

وأعتقد أن هذه الطريقة هي شفافة تماما ويساعد على فهم قانون مكتوب - القضاء على جميع الشيكات لاغية في طريقة لطيفة

لاحظ T <: AnyRef - يجب عليك فعله فقط هذا التحويل الضمني لأنواع القيم التي تسمح null، التي بحكم تعريفها هي أنواع المراجع

المبادئ التوجيهية العامة ضمنية التحويلات كما يلي:

  • عندما كنت في حاجة لإضافة أعضاء إلى نوع (a la "فتح فصول";الملقب "القواد بلدي مكتبة" نمط), تحويل جديد النوع الذي يمتد AnyRef و الذي يحدد فقط الأعضاء التي تحتاج إليها.
  • عندما تحتاج إلى "الصحيح" الميراث الهرمي.وهكذا يكون لديك نوع A التي يجب أن يكون ثم subclassed B, ولكن لم لسبب ما.في هذه الحالة يمكنك تحديد التحويل الضمني من A إلى B.

هذه هي فقط الحالات حيث أنها مناسبة لتعريف التحويل الضمني.أي تحويل يمتد إلى نوع سلامة وصحة القضايا في عجلة من امرنا.

حقا لا يجعل من أي معنى T تمديد Option[T], و من الواضح أن الغرض من التحويل ليست مجرد إضافة أعضاء.وبالتالي ، فإن مثل هذا التحويل غير المستصوب.

ويبدو أن هذا يمكن أن يكون مربكا للمطورين الآخرين، لأنها قراءة التعليمات البرمجية.

وعموما، على ما يبدو، implicit تعمل على مساعدة المدلى بها من كائن إلى آخر، لقطع الخلط بين الصب التعليمات البرمجية التي رمز يمكن فوضى، ولكن، إذا كان لدي بعض متغير ويصبح نوعا ما Some ثم التي من شأنها أن تبدو مزعجة .

وأنت قد ترغب في وضع بعض الرموز التي تظهر انها تستخدم، لنرى كيف الخلط بين أنه سيكون.

ويمكنك أيضا أن تحاول تفرط في الأسلوب:

def having(key:String) = having(key, None)

def having(key:String, default:String) = having(key, Some(default))

def having(key: String, default: Option[String]=Option.empty) : Create = {
  keys += ( (key, default) )
  this
}

وهذا تبدو جيدة بالنسبة لي، إلا أنه لا يجوز العمل لT البدائية (التي لا يمكن أن تكون فارغة). I تخمين العامة البدائيون المتخصصة غير يحصل دائما محاصر، لذلك ربما كان على ما يرام.

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