স্কালা অপশন (নাল) কিছুই হিসাবে প্রত্যাশিত কিন্তু আমি কিছু পেয়েছি (0)


9
val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)

null: java.lang.Integerস্কালায় রূপান্তর করার নিরাপদ উপায় কী Option[Int]?


1
আপনি কি প্রশ্নে আপনার কোড পেস্ট করতে পারেন?
Олегович Олегович

উত্তর:


17

আপনি মিশ্রণ করছেন Intএবং java.lang.Integerতাই

val i: java.lang.Integer = null
val o: Option[Int] = Option(i)

স্পষ্টত রূপান্তরিত

val o: Option[Int] = Option(Integer2int(i))

যা হয়ে যায়

val o: Option[Int] = Option(null.asInstanceOf[Int])

এইভাবে

val o: Option[Int] = Some(0)

আপনি যদি কাজ করতে চান java.lang.Integer, তবে লিখুন

val o: Option[java.lang.Integer] = Option(i)
// o: Option[Integer] = None

2
এটি সম্প্রতি কোথাও জিজ্ঞাসা করা হয়েছিল, সুতরাং এটি একটি বাস্তব গোচা। হতে পারে সমস্যাটি নির্ভরতার উপর নির্ভর করছে: Option[Integer](i).map(_.intValue)আমার কাছে এটি সবচেয়ে বুদ্ধিমান বলে মনে হচ্ছে, যেহেতু এটি বলছে যে এটি কী করছে। এছাড়াও, -Xlintসতর্কতাটি দেখতে ব্যবহার করুন val o!
সোম-স্নিটে

বক্সিং রাউন্ডট্রিপ এড়ানোর জন্য, `ভল এক্স: বিকল্প [ইন্ট] = বিকল্প (আই) .আস ইনস্ট্যান্সঅফ [বিকল্প [অন্তর্]]` যেখানে Integerঅনুমান করা হয়েছে।
সোম-স্নিট

7

এটি ঘটছে বলে মনে হচ্ছে কারণ আপনি এটি তৈরি করছেন Optionএবং Intএক ধাপে এটি রূপান্তর করছেন (@ মারিও গ্যালিকের উত্তর কেন এমন হচ্ছে তা ব্যাখ্যা করে)।

এটি আপনি যা চান তা করে:

scala> val o: java.lang.Integer = null
o: Integer = null

scala> val i: Option[Int] = Option(o).map(_.toInt)
i: Option[Int] = None

scala> val o1: java.lang.Integer = 1
o1: Integer = 1

scala> val i1: Option[Int] = Option(o1).map(_.toInt)
i1: Option[Int] = Some(1)

অন্য উত্তর, আমি প্রস্তাব _.intValue। আমার ধারণা এটি কেবল রূপান্তর কলটিই সংরক্ষণ করে।
সোম-স্নিট

1

এর আগেও একই সমস্যার মুখোমুখি হয়েছিল। এই প্রশ্নবিদ্ধ আচরণটি স্কালা দলটি দ্বারা পরিচিত। দেখে মনে হচ্ছে এটি পরিবর্তন করা অন্য কোথাও কিছু ভেঙে যায়। দেখুন https://github.com/scala/bug/issues/11236 এবং https://github.com/scala/scala/pull/5176


2
সত্যই সন্দেহজনক আচরণটি nullএকটি পূর্ণসংখ্যা হিসাবে আচরণ করে । এটি সম্ভবত একটি হ্যাংওভার Cযেখানে 0থেকে কোনও পয়েন্টারের কাছে বরাদ্দ করা ঠিক আছে । তবে এর অর্থ এই নয় যে ফলস্বরূপ পয়েন্টারটি হ'ল 0, সুতরাং দু'জনের মধ্যে এমনকি স্যুইচ করাও বেআইনী C
টিম

Integerসম্ভবত সম্ভবত জাভা কোড থেকে এসেছিল তাই 'শূন্যটিকে পূর্ণসংখ্যা হিসাবে ব্যবহার করবেন না' কোনও কার্যক্ষম পরামর্শ নয়। এবং আমরা পরিষ্কারভাবে এই পূর্ণসংখ্যাটি ব্যবহারযোগ্যতা ব্যবহারের জন্য পরীক্ষা করে দেখি Option.apply। সুতরাং আমরা অপ্রত্যাশিত আউটপুটটি ডব্লু / ও স্পষ্টভাবে যে কোনও অনিরাপদ ক্রিয়াকলাপটি করি get
সাদাদাজো

মুল বক্তব্যটি হ'ল মূল কারণ জাভা হ'ল আপনি "সন্দেহজনক আচরণ" এর জন্য স্কালাকে দোষ দিতে পারবেন না। কার্যক্ষম পরামর্শটি হ'ল জাভা প্রকার থেকে সুস্পষ্ট রূপান্তর হ'ল সুস্পষ্ট রূপান্তর ব্যবহারের পরিবর্তে সমতুল্য স্কালার ধরণগুলিতে। (তাই JavaConvertersপরিবর্তে JavaConversion)
টিম

1
ঠিক আছে, আমি এবং আমি স্ক্যালাকে এই ক্ষেত্রে সংকলন ত্রুটি / সতর্কতা নির্গমন না করার জন্য দোষ দিতে পারি। এমনকি রানটাইম ক্রাশ আরও ভাল হবে। এমনকি আমার একা কোম্পানিতেও স্কালায় 5+ বছরের অভিজ্ঞতা সম্পন্ন 2 বিকাশকারীরা এই সমস্যায় পড়েছেন।
ইম্পাদাজো

1
@ টিম কেবল কল করে রানটাইম ক্র্যাশ পাওয়া খুব সহজ হবে theInteger.intValue()। ক্র্যাশ এড়ানো এড়াতে অতিরিক্ত রানটাইম চেক লাগবে। স্কালার পুরানো সংস্করণগুলিতে, এই রূপান্তরটি সত্যই একটি এনপিই তৈরি করেছে; এটি একটি বাগ হিসাবে রিপোর্ট করা হয়েছিল, এবং বর্তমান আচরণের সাথে এটি স্থির করা হয়েছে। আমি কোনও স্কালার বিশেষজ্ঞ নই, তবে আমি ala তিহাসিক প্রসঙ্গ হিসাবে স্কেল -ডেভ # 355 এবং স্কেল # 5176 খনন করেছি ।
amalloy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.