স্ক্যালায় অপশন সহ জাভাতে নাল-রিটার্নিং পদ্ধতি মোড়ানো?


107

ধরুন আমার একটি পদ্ধতি আছে session.get(str: String): Stringতবে আপনি জানেন না এটি আপনাকে স্ট্রিং বা নাল ফেরায় কিনা তা জাভা থেকে এসেছে।

এর পরিবর্তে স্কালায় এটির চিকিত্সা করার সহজ উপায় কি আছে session.get("foo") == null? হয়তো কিছু ম্যাজিক এর মতো প্রয়োগ হয় ToOption(session.get("foo"))এবং তারপরে আমি এটিকে স্কালার মতো আচরণ করতে পারি

ToOption(session.get("foo")) match {
    case Some(_) =>;
    case None =>;
}

4
আরও অপশন ট্রিকের জন্য দেখুন blog.tmorris.net/scalaoption-cheat-heet
ল্যান্ডেই

4
উপরের লিঙ্কটি blog.tmorris.net/posts/scalaoption-cheat-sheet হওয়া উচিত ।
জ্যাসেক লাসকোভস্কি

উত্তর:


182

Optionসহচর বস্তুর applyপদ্ধতি nullable রেফারেন্স থেকে একটি রূপান্তর ফাংশন হিসেবে কাজ করে:

scala> Option(null)
res4: Option[Null] = None

scala> Option(3)   
res5: Option[Int] = Some(3)

19

Optionবস্তু একটি হয়েছে applyপদ্ধতি যা ঠিক তাই করছে:

var myOptionalString = Option(session.get("foo"));

5

লক্ষ্য করুন যে জাভা অবজেক্টের সাথে কাজ করার সময় এটি প্রত্যাশার মতো কাজ করবে না:

val nullValueInteger : java.lang.Integer = null
val option: Option[Int] = Option(nullValueInteger)
println(option)  // Doesn't work - zero value on conversion

val nullStringValue : String = null
val optionString: Option[String] = Option(nullStringValue)
println(optionString) // Works - None value

1
আমি স্কেল 2.11.8 নিয়ে দৌড়েছি। দ্বিতীয় লাইন নালপয়েন্টার এক্সসেপশন নিক্ষেপ করেছে। ষষ্ঠ লাইনটি কিছু (নাল) পেয়েছে, আপনার প্রত্যাশার মতো কিছুই নেই।
জন লিন

1. অপশন স্ট্রিংয়ের বিকল্পের পরিবর্তে কিছু ব্যবহৃত - মূল উত্তরে পরিবর্তিত। 2. স্কেল ২.১২.৫
কেবল

-3

এটি একটি খুব পুরানো বিষয় কিন্তু একটি দুর্দান্ত!

এটি সত্য যে বিকল্পে চেষ্টা করার কোনও অ-ব্যতিক্রমী ফলাফলকে রূপান্তর করার ফলে কিছুটা ...

scala> Try(null).toOption
res10: Option[Null] = Some(null)

... কারণ চেষ্টা হ'ল নৈন্যতা যাচাইয়ের বিষয়ে নয় তবে ব্যতিক্রমগুলি কার্যকরভাবে পরিচালনা করার একটি উপায়।

একটি ব্যতিক্রম ধরা চেষ্টা করুন এবং সুবিধার জন্য একটি বিকল্প রূপান্তর এটি ব্যবহার ব্যতিক্রম ঘটায় শুধুমাত্র কিছুই দেখায় না।

scala> Try(1/0).toOption
res11: Option[Int] = None

আপনি চেষ্টা থেকে আসা মানগুলি সংরক্ষণ করতে চান। এটা নাল হতে পারে।

তবে এটি সত্য যে স্ট্যান্ডার্ড লিব কখনও কখনও বেশ বিভ্রান্ত হয় ...

scala> Try(null).toOption
res12: Option[Null] = Some(null)

scala> Option(null)
res13: Option[Null] = None

এই আচরণটি কিছুটা বেমানান তবে এটি ধরণের চেষ্টা এবং বিকল্প উভয়েরই ইচ্ছাকৃত ব্যবহারকে প্রতিফলিত করে।

আপনি কোনও অভিব্যক্তি যা কিছু ব্যতিক্রম হতে পারে তার বাইরে যাবার চেষ্টা করুন এবং আপনি ব্যতিক্রম নিজেই চিন্তা করেন না।

মানটি যে খুব ভালভাবে বেরিয়ে আসতে পারে তা একটি নাল হতে পারে। যদি টুঅপশন কোনওটি না দেয় তবে আপনি ব্যতিক্রম এবং শূন্যতার মধ্যে পার্থক্য করতে পারবেন না এবং এটি সুন্দরও নয়!

স্বতঃস্ফূর্ত, আপনি কোনও কিছুর অস্তিত্ব সজ্জিত করতে বিকল্প ব্যবহার করেন। সুতরাং সেই ক্ষেত্রে কিছু (নাল) কোনওটিই নয়, এবং এটি বোধগম্য হয় কারণ সেই ক্ষেত্রে নাল কোনও কিছুর অনুপস্থিতি প্রতিনিধিত্ব করে। এখানে কোনও অস্পষ্টতা নেই।

এটি মন্তব্য করা গুরুত্বপূর্ণ যে কোনও ক্ষেত্রেই রেফারেন্সিয়াল স্বচ্ছতা নষ্ট হয় না

আপনার যদি সত্যই উভয় ব্যতিক্রমী সুরক্ষা এবং নাল সুরক্ষা প্রয়োগ করতে হবে এবং আপনার কোডটি সত্যই নাল এবং একটি ব্যতিক্রমের মধ্যে পার্থক্য করার প্রয়োজন নেই , আপনাকে কেবল উভয় দৃষ্টিকোনকে একত্রিত করতে হবে! কারণ ভাল, আপনি কি চান তাই না?

আপনি এটি এক উপায়ে করতে পারেন ...

scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None

scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None

scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)

... অথবা অন্যটি ...

scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None

scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None

scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)

... বা হাস্যকরভাবে কুৎসিত তাদেরকে ...

scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None

scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None

scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.