0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

نوع داده Symbol در Scala چه تفاوتی با String دارد و کاربردش چیست؟

1 پاسخ

+3 امتیاز
قبل توسط (60 امتیاز)

اشیاء در نقاط مختلف حافظه قرار می‌گیرند و الزاما برابر بودن مقدار دو رشته به معنی این نیست که هر دو رشته در یک مکان از حافظه قرار دارند. به عبارت دیگر ممکن است Reference Equal نباشند.

Symbol رشته‌ها را اصطلاحا Intern می‌نماید و به این ترتیب همیشه دو شی Symbol با محتوی یکسان از نظر Reference هم یکی هستند و در یک نقطه از حافظه قرار دارند. به طور کلی استفاده از Symbol به جای String تضمین می‌کند که هر نوع مقایسه‌ای نتیجه یکسان خواهد داشت (Equals، RefrenceEquals، ==).

اما فایده آن چیست؟ بررسی اینکه دو String با هم برابر هستند شامل بررسی تک تک بایت‌های آن است ولی برای بررسی اینکه دو  Symbol با هم برابر هستند کافیست Reference آن‌ها با هم مقایسه شوند، که سریع‌تر از مقایسه String است. در عوض معمولا ایجاد یک شی Symbol زمان بیشتری از ایجاد یک String می‌برد.

قبل توسط (1.1هزار امتیاز)
String هایی که با double quote تعریف می شوند هم Intern هستند. دقیقا سوال من همینه که پس تفاوت کجاست؟
قبل توسط (60 امتیاز)
رشته‌های ثابت و غیر ثابت همگی از جنس String هستند و تضمینی وجود ندارد که نوع String در جاوا (و اسکالا) intern باشد به همین خاطر در هنگام مقایسه هزینه بیشتری از Symbol دارد.

http://stackoverflow.com/questions/3554362/purpose-of-scalas-symbol
قبل توسط (1.1هزار امتیاز)
به مثال موجود در این جواب نگاه کنید:
https://javabyab.com/4459
در جاوا String هایی که با double quote تعریف می شوند را interned String object می گویند.
قبل توسط (60 امتیاز)
بله من هم این موضوع رو تایید کردم. نکته اینجاست که double quoted string ها هم String هستند و در هنگام مقایسه اول بررسی می‌شود که inten شده است یا نه و بعد بایت به بایت مقایسه صورت می‌گیرد. البته در صورتی که از equals استفاده شود نه ==.
البته چون در اسکالا == طور بهتری عمل می‌کند به نظر من فرق بین استفاده از Quoted String و Symbol در هنگام مقایسه یک If اضافه است که در بررسی دو String وجود دارد.

به هر حال دو شی Symbol  به مقدار خیلی خیلی کمی سریعتر از String مقایسه می‌شوند.
قبل توسط (1.1هزار امتیاز)
ممنون از جوابت. یعنی تنها کاربرد و مزیت Symbol همینه!؟ در Ruby کاربرد های بیشتری داره.
قبل توسط (60 امتیاز)
البته این اطلاعات منه! شاید مزیت‌های دیگه‌ای هم داشته باشه. اگر در مورد مزیت‌هاش توی Ruby یه Refrence بدی یا همینجا اطلاعات بیشتری بدی ممنون می‌شم.
قبل توسط (1.1هزار امتیاز)
در حال مطالعه عمیقتر هستم و به جواب خوبی برسم حتما در قالب جواب ایجا مطرح می کنم. فعلا دستگیرم شده که علاوه بر مزیت performance که شما ذکر کردید در matching و reflection و همچنین طراحی DSL ها کاربرد های خوبی داره.
قبل توسط (60 امتیاز)
+1
اینطوری که من از جاهای مختلف خوندم و دیدم توی زبان‌های دینامیک Symbol ها کاربردهای خوبی دارن اما برای زبان‌های استاتیک بخاطر اینکه می‌شه خیلی از این کارهای رو از طریق Typeها انجام داد خیلی نیازی به استفاده از Symbol نیست.

سوالات مشابه

+1 امتیاز
2 پاسخ 2.1هزار بازدید
+1 امتیاز
1 پاسخ 691 بازدید
+1 امتیاز
2 پاسخ 1.2هزار بازدید
0 امتیاز
1 پاسخ 1.5هزار بازدید
0 امتیاز
1 پاسخ 731 بازدید
0 امتیاز
1 پاسخ 1.3هزار بازدید
+1 امتیاز
1 پاسخ 448 بازدید
0 امتیاز
0 پاسخ 904 بازدید
...