روبی (زبان برنامهنویسی)
پارادایم برنامهنویسی | چندپارادایم: شیءگرا، دستوری، تابعی، رفلکشن |
---|---|
طراحی شده توسط | یوکیهیرو ماتسوموتو |
توسعهدهنده | یوکیهیرو ماتسوموتو و همکاران. |
ظهوریافته در | ۱۹۹۵ |
انتشار پایدار | ۳٫۰٫۰[۱]
/ ۲۵ دسامبر ۲۰۲۰ |
اردکی، پویا | |
دامنه | واژگانی، گاهی پویا |
زبان پیادهسازی | سی |
سیستمعامل | چندسکویی |
پروانه | روبی، GPLv2 یا پروانههای بیاسدی مجوز[۲][۳][۴] |
.rb, .rbw | |
وبگاه | |
پیادهسازیهای بزرگ | |
روبی امآرآی، یارو، روبینیوس، ماگلو، جیروبی، مکروبی، روبیموشن، هاتروبی، آیرونروبی، امروبی | |
متأثر از | |
ایدا،[۵] سی++,[۵] سیالیو،[۶] دایلان،[۶] ایفل،[۵] لوآ، لیسپ،[۶] پرل،[۶] پایتون،[۶] اسمالتاک[۶] | |
تأثیر گذاشته بر | |
کلوژر، دی،[۷] الیکزیر، فالکن، گرووی، آیوک،[۸] جولیا،[۹] میراه، نو،[۱۰] پوشن، ریا، سوئیفت[۱۱] | |
روبی (به انگلیسی: Ruby) یک زبان برنامهنویسی انعطافپذیر، وب،تست نفوذ، پویا و شیءگرا است. روبی ویژگیهای نگارشی پرل و شی گرایی اسمالتاک را با هم در خود دارد. زبان روبی در سالهای میانی دهه ۱۹۹۰ توسط یوکیهیرو ماتسوموتو در ژاپن اختراع شد. ویژگیهای گوناگون زبانهای پرل، لیسپ، اسمالتاک و آیفل الهامبخش ماتسوموتو در ساخت روبی بودند.
زبان روبی پارادایمهای گوناگون برنامهنویسی از جمله برنامهنویسی تابعی، شیء گرا و بازتابی را پشتیبانی میکند، دارای گزارهها و متغیرهای پویا و مدیریت حافظه خودکار است.
نسخه فعلی این زبان روبی ۲٫۳٫۳ است که به زبان سی و به صورت زبانی با مفسر تکگذره پیادهسازی شدهاست.[۱۲] تا سال ۲۰۱۰، گونههای مختلفی از زبان روبی توسعه یافتهاند که از میان آنها میتوان به جیروبی، روبینوس، مکروبی، آیرنروبی و هاتروبی، ام روبی اشاره کرد.
تاریخچه
[ویرایش]زبان روبی رسماً در روز ۲۴ فوریه ۱۹۹۳ (۵ اسفند ۱۳۷۱) توسط یوکیهیرو ماتسوموتو معرفی شد. او دنبال ساخت زبانی بود که امکانات متعادلی برای برنامهنویسی تابعی و برنامهنویسی دستوری برای برنامهنویس فراهم آورد. ماتسوموتو دربارهٔ انگیزهاش برای ساخت روبی میگوید: «در جستجوی زبانی بودم که از پایتون شیءگراتر و از پرل قدرتمندتر باشد. برای همین تصمیم گرفتم خودم آن را بسازم».
نام «روبی»
[ویرایش]یوکیهیرو ماتسوموتو و همکارش دو نام «روبی» و «کورال» را برای این زبان جدید برگزیده بودند. از آنجاییکه نام کورال پیش از آن برای یکی از زبانهای برنامهنویسی بریتانیایی انتخاب شده بود(کورال)، نام «روبی» به عنوان نام نهایی برگزیده شد. ماتسوموتو گفته که یکی از دلایل انتخاب نام «روبی» این بود که یاقوت (به انگلیسی: Ruby) نشان ماه تولد یکی از همکاران وی بودهاست.
اولین انتشار
[ویرایش]نخستین ویرایش روبی با عنوان روبی ۰٫۹۵ در ۲۱ دسامبر ۱۹۹۵ (میلادی) (۳۰ آذر ۱۳۷۴) روی یکی از شبکههای تخصصی اینترنتی در ژاپن منتشر شد. پس از آن، سه ویرایش دیگر رویی در ظرف دو روز انتشار یافتند. در همین دوره نخستین لیست پست الکترونیک برای روبی در ژاپن براه افتاد.
روبی ۱٫۰
[ویرایش]نخستین نسخه اصلی روبی با عنوان روبی ۱٫۰ در ۲۵ دسامبر ۱۹۹۶ (۵ دی ۱۳۷۵) منتشر شد. پس از انتشار روبی ۱٫۳ در سال ۱۹۹۹، نخستین لیست پست الکترونیک به زبان انگلیسی آغاز بکار کرد. در سپتامبر سال ۲۰۰۰ نخستین کتاب راهنمای برنامهنویسی به زبان روبی به انگلیسی به چاپ رسید که به افزایش محبوبیت این زبان در کشورهای مختلف کمک کرد.
روبی ۱٫۹٫۱
[ویرایش]جدیدترین نسخه پایدار روبی، نسخهٔ ۱٫۹٫۱ است که نسبت به نسخهٔ پیشین (۱٫۸٫۶) چند تغییر عمده در خود دارد. از جمله تغییرات مهم میتوان به افزودن متغیرهای محلی در «بلوک»های روبی، و امکان تنظیم کدگذاری رشتهها به صورت مستقل از هم اشاره کرد.
روبی ۲٫۰
[ویرایش]پس از نسخه ۱٫۹ نسخهٔ ۲٫۰ منتشر خواهد شد.[۱۳]
از اکتبر ۲۰۱۱ برنامهریزی شدهاست که کدهای روبی در اکتبر ۲۰۱۲ فریز شود و در فوریه ۲۰۱۲ منتشر شود.[۱۴]
روبی ۲٫۱
[ویرایش]نسخه ۲٫۱ در کریسمس سال ۲۰۱۳ منتشر شد. این بروزرسانی شامل، افزایش سرعت، و به روزرسانی کتابخانهها، و تعمیر باگ، بود.
در ۲۱ آپریل ۲۰۱۷، اعلام شد که دیگر از این نسخه پشتیبانی نمیشود.
روبی ۲٫۴
[ویرایش]روبی ۲٫۴٫۰ در کریسمس سال ۲۰۱۶ منتشر شد و تغییرات قابل توجه عبارتند از:
- اتصال #irb: شروع یک جلسه REPL مشابه اتصال .pry
- یکی کردن Fixnum و Bignum به کلاس عدد صحیح(Integer)
- String supports Unicode case mappings, not just ASCII
- a new method, Regexp#match?, which is a faster boolean version of Regexp#match
- Thread deadlock detection now shows threads with their backtrace and dependency
شاخه ۲٫۴ همچنین شامل بهبود عملکرد هش جدول، آرایه#حداکثر، آرایه#دقیقه و به عنوان مثال دسترسی متغیرها است.[۱۵]
روبی ۲٫۵
[ویرایش]روبی ۲٫۵٫۰ در کریسمس سال ۲۰۱۷ منتشر شد.[۱۶] چند تغییر قابل توجه، شامل موارد زیر است:
- rescue and ensure statements automatically use a surrounding do-end block (less need for extra begin-end blocks)
- Method-chaining with yield_self
- Support branch coverage and method coverage measurement
- Easier Hash transformations with Hash#slice and Hash#transform_keys
On top of that come a lot of performance improvements like faster block passing (3 times faster), faster Mutexes, faster ERB templates and improvements on some concatenation methods.
روبی ۲٫۶
[ویرایش]روبی ۲٫۶٫۰ در کریسمس سال ۲۰۱۸ منتشر شد.[۱۷] چند تغییر قابل توجه، شامل موارد زیر است:
- JIT (experimental)
- RubyVM::AbstractSyntaxTree (experimental)
روبی ۲٫۷
[ویرایش]روبی ۲٫۷٫۰ در کریسمس سال ۲۰۱۹ منتشر شد.[۱۸] چند تغییر قابل توجه، شامل موارد زیر است:
- Pattern Matching (experimental)
- REPL improvement
- Compaction GC
- Separation of positional and keyword arguments
روبی ۳٫۰
[ویرایش]روبی ۳٫۰٫۰ در کریسمس سال ۲۰۲۰ منتشر شد.[۱۹] چند تغییر قابل توجه، شامل موارد زیر است:
- Performance
- MJIT
- Concurrency
- Ractor
- Fiber Scheduler
- Typing (Static Analysis)
- RBS
- TypeProf
جدول نسخهها
[ویرایش]نسخه | آخرین نسخه کوچک | تاریخ انتشار اولیه | پایان مرحله پشتیبانی | پایان فاز نگهداری امنیتی |
---|---|---|---|---|
۱٫۰ | ن/م | ۱۳۷۵٫۱۰٫۰۵[۲۰] | ن/م | ن/م |
۱٫۸ | ۱٫۸٫۷-پی۳۷۵[۲۱] | ۱۳۸۲٫۰۵٫۱۳[۲۲] | ۱۳۹۱٫۰۴٫۱۰[۲۳] | ۱۳۹۳٫۰۴٫۱۰[۲۴] |
۱٫۹ | ۱٫۹٫۳-پی۵۵۱[۲۵] | ۱۳۸۶٫۱۰٫۰۴[۲۶] | ۱۳۹۲٫۱۲٫۰۴[۲۷] | ۱۳۹۳٫۱۲٫۰۴[۲۸] |
۲٫۰ | ۲٫۰٫۰-پی۶۴۸[۲۹] | ۱۳۹۱٫۱۲٫۰۶[۳۰] | ۱۳۹۳٫۱۲٫۰۵[۲۹] | ۱۳۹۴٫۱۲٫۰۵[۲۹] |
۲٫۱ | ۲٫۱٫۱۰[۳۱] | ۱۳۹۲٫۱۰٫۰۴[۳۲] | ۱۳۹۵٫۰۱٫۱۱[۳۳][۳۴] | ۱۳۹۶٫۰۱٫۱۰[۳۵] |
۲٫۲ | ۲٫۲٫۱۰[۳۶] | ۱۳۹۳٫۱۰٫۰۴[۳۷] | ۱۳۹۶٫۰۱٫۰۸[۳۸] | ۱۳۹۷٫۰۱٫۱۱[۳۹] |
۲٫۳ | ۲٫۳٫۸[۴۰] | ۱۳۹۴٫۱۰٫۰۴[۴۱] | ۱۳۹۷٫۰۳٫۳۰[۴۲] | ۱۳۹۸٫۰۱٫۱۱[۴۲] |
۲٫۴ | ۲٫۴٫۱۰[۴۳] | ۱۳۹۵٫۱۰٫۰۵[۴۴] | ۱۳۹۸٫۰۱٫۱۲[۴۵] | ۱۳۹۹٫۰۱٫۱۳[۴۵] |
۲٫۵ | ۲٫۵٫۸[۴۶] | ۱۳۹۶٫۱۰٫۰۴[۴۷] | ن/م | ن/م |
۲٫۶ | ۲٫۶٫۶[۴۸] | ۱۳۹۷٫۱۰٫۰۴[۴۹] | ن/م | ن/م |
۲٫۷ | ۲٫۷٫۲[۵۰] | ۱۳۹۸/۱۰/۰۴[۵۱] | ن/م | ن/م |
۳٫۰ | ۳٫۰٫۰[۵۲] | ۱۳۹۹/۱۰/۰۵[۵۳] | ن/م | ن/م |
ایجاز: نگارش قدیمی نگارش قدیمیتر، هنوز پشتیبانی میشود نگارش پایدار جاری آخرین نگارش پیشنمایش انتشار آتی |
چهارچوبهای نرمافزاری
[ویرایش]- روبی آن ریلز چهارچوب محبوب و مورد علاقهٔ اکثر برنامه نویسان روبی است که در سال ۲۰۰۵ توسط آقای David Heinemeier Hansson یا به اختصار DHH بنیانگذاری شد، بهطور دیگر میتوان گفت اکثر برنامهنویسان توسط ریلز به روبی کشیده شدهاند! نامهای «روبی» و «روبی آن ریلز» آنقدر با هم استفاده شدهاند که برای بسیاری شاید تفاوت این دو روشن نباشد.
- سیناترا یکی دیگر از فریمورکهای قدرتمند روبی است که ساختار بسیار سبکتری نسبت به روبی آن ریلز دارد و ساختار پایهای آن شامل مدیریت کردن مسیرها است (نکته: اما در صورت نیاز میتوان بستههای روبی آن ریلز را در آن وارد کرد). سیناترا توسط Blake Mizerany ساخته شده و از معماری MVC برخوردار است.
- پادرینو یک چهارچوب کوچک با توابع کمکی بسیار کاربردی است. یکی از مهمترین مزایای پادرینو، داشتن generator است که به توسعه نرمافزار کمک شایانی میکند.
فلسفه
[ویرایش]سازنده زبان روبی یوکیهیرو ماتسوموتو میگوید روبی برای افزایش توان تولید و تفریح برنامهنویسان طراحی شدهاست و از اصل رابط کاربری خوب پیروی میکند. او تأکید میکند که طراحی سامانهها باید بیشتر روی نیاز انسانها متمرکز باشد تا رایانهها.
اغلب مردم، به ویژه برنامهنویسان، روی ماشینها تمرکز میکنند. آنها فکر میکنند «با انجام این کار ماشینها سریعتر میشوند، ماشینها در اجرا موثرتر میباشند و…» آنها بر ماشین تمرکز میکنند، اما در حقیقت ما نیاز داریم که به انسانها توجه کنیم، اینکه چگونه آنها به برنامهنویسی توجه دارند یا چگونه به اجرای برنامههای ماشین دقت میکنند.
روبی برای تعقیب هدف کمترین غافلگیری بیان شدبه این معنی که زبان باید طوری رفتار کند که کمترین گیجکنندگی را برای استفادهکنندههای آن داشته باشد. ماتسوموتو همچنین اظهار میدارد که هدف اولین طراحی او درست کردن زبانی که خودش از آن لذت ببرد بود. این کار با کم کردن کار برنامهنویس و ابهامات منطقی میباشد. اما کمترین غافلگیری هنوز خیلی به بیان زبان برنامهنویسی روبی نزدیک است.
افراد ناشی شاید این را به این معنا تعبیر کنند که رفتارهای روبی سعی در متصل کردن اشتراکات رفتارهای دیگر زبانها را دارد.
در بحث ماه مه ۲۰۰۵ در روزنامه "کامپ. لنگ. روبی" ماکسوموتو تلاش کرد که روبی را از حداقل غافلگیری دور کند. توضیح اینکه هر شانس طراحی بعضیها را متعجب میکند.
او از استاندارد خود برای ارزیابی غافلگیری استفاده کرد. ماتسوموتو این را در یک گزارش مطرح ساخت.
همه یک پیشینه شخصی دارند، بعضیها از جانب پایتون میآیند بعضیهای دیگر از پرل و آنها ممکن است از بعضی از جنبههای متفاوت زبان غافلگیر شوند. سپس آنها به من میگویند ما از بعضی از جنبههای زبان غافلگیر شدیم، بنابرین روبی قانون کمترین غافلگیری را زیر پا گذاشتهاست. صبر کنید… هدف کمترین غافلگیری فقط برای شما نیست. این هدف به معنای کمترین غافلگیری ممکن برای بیان من میباشد. این به معنای کمترین غافلگیری بعد از آموزش کامل زبان است. برای مثال من قبل از اینکه روبی را طراحی کنم یک برنامهنویس سی پلاس پلاس بودم. من منحصراً دو، سه سال در سی پلاس پلاس برنامه نوشتم و بعد از دو سال برنامهنویسی با آن، هنوز مرا متعجب میکرد.
معنیشناسی
[ویرایش]روبی شی گراست: همه انواع داده شی هستند، از جمله کلاسها و خیلی از انواع دادهای که بهطور معمول در بقیه زبانها نیز هست مانند داده صحیح، دودویی و…. تابع به صورت متد است. روبی ارثبری را با فرستادن پویا و متدهای یکتا پشتیبانی میکند (متعلق به، تعریف شده برای، یک نمونه تک به جای تعریف شدن در کلاس). همچنین روبی از ارث بری چندگانه پشتیبانی میکند. نحو رویهای پشتیبانی میشود، اما همهٔ متدها که خارج از حوزه یک شی خاص تعریف میشوند همه آن در حقیقت متدهای شی یک کلاس هستند. تا زمانی که این کلاس والد کلاس دیگر است تغییرات برای همه کلاسها و شیها ممکن است. روبی به عنوان یک زبان برنامهنویسی چند مدلی تشریح شده. در روبی اجازهٔ برنامهنویسی رویهای، شیءگرا و تابعی داده شده.
بر طبق سوالات متداول روبی «اگر تو به پرل علاقهمند باشی روبی را هم دوست خواهی داشت و میتوانی از نحو آن استفاده کنی. اگر اسمالتالک را دوست داری روبی را هم دوست خواهی داشت و میتوانی از معنای آن لذت ببری و اگر طرفدار پایتون هستی تو ممکن است تفاوت عمدهای بین پایتون و روبی پیدا کنی یا که نه.»
امکانات
[ویرایش]- کاملاً شی گرا
- داینامیک
- نحو کوتاه و انعطافپذیر
- چهار سطح از حوزه دید متغیر شامل: global, class ,instance ,local
- مدیریت استثناء
- پشتیبانی از iterators و closures (بر اساس تبادل بلوکهای کد)
- پشتیبانی محلی از regular expressions (شبیه پرل) در سطح زبان
- سربارگزاری عملگرها
- جمعآوری زباله خودکار
- قابلیت حمل بالا
- در همه سیستمعامل اصلی پیادهسازی
- پردازش استثناء
- سربار اپراتور
- پشتیبانی شراکتی از multi-threading در تمام پلتفرمهای با استفاده از green threads
- پشتیبانی کامل از یونیکد و رمزنگاریهای شخصیت چند گانه (از نسخه ۱٫۹)
- کتابخانههای اشتراکی/DLL در اکثر پلتفرمها
- introspection, reflection و meta-programming
- اتصال بومی APIها در C
- پوسته تعاملی روبی (REPL)
- بسته مدیریت متمرکز از طریق RubyGems
- کتابخانه استاندارد بزرگ
- پشتیبانی از تزریق نیازمندی
- continuations و generators
تعامل
[ویرایش]توزیع استاندارد روبی دارای یک مفسر تعاملی خط فرمان بنام irb است که میتواند برای آزمایش سریع کد بکار رود. یک نشست با این برنامه تعاملی به صورت زیر است:
$ irb
irb(main):001:0> puts "Hello, World"
Hello, World
=> nil
irb(main):002:0> 1+2
=> 3
همچنین وجود ماژول readline به کاربر امکان استفاده از shellهای مختلف را با پشتیبانی از تاریخچه تغییرات میدهد.
Readline.readline('', true) # param true means ~ "enable history"
سینتکس
[ویرایش]سینتکس روبی بسیار شبیه سینتکس پرل و پایتون است. اعلان کلاسها و متدها توسط کلمات کلیدی انجام میشود. در مقایسه با پرل متغیرها الزاماً با یک علامت خاص شروع نمیشوند. (وقتی از چنین علائمی استفاده شود علامت حوزه دید متغیر را تغییر میدهد) بارزترین تفاوت روبی از سی و پرل آنست که کلمات کلیدی (بجای براکت) برای تعریف بلوکهای کد استفاده میشوند. سطر جدید بهعنوان پایان یک جمله بکار برده میشود در عین حال که برای اینکار میتوان از یک سمی کالون (;) نیز استفاده کرد. تورفتگیها معنی خاصی ندارند (برعکس پایتون). نمونههایی از سینتکس روبی را میتوانید در بخش مثالها ببینید.
چیزهای غافلگیرکننده
[ویرایش]با وجود اینکه طراحی روبی بر اصل عدم غافلگیری استوار است، بهطور طبیعی برخی امکانات آن از زبانهایی مانند سی و پرل متفاوت است:
- نامهایی که با حرف بزرگ شروع میشوند به عنوان ثابت (constant) در نظر گرفته میشوند، بنابراین متغیرهای محلی بایستی با حروف کوچک آغاز شوند.
- به منظور وضوح مقادیر اعشاری (float)، بایستی با یک صفر بعد از نقطه مشخص شوند (۹۹٫۰) یا اینکه از یک تبدیل صریح (99.to_f) استفاده شود. تنها اضافه کردن یک نقطه بعد از عدد (.۹۹) کافی نیست زیرا در این حالت اعداد مستعد پذیرش بهعنوان یک متد هستند.
- مقادیر بولین اطلاعات غیر بولین سخت گیرانه هستند: ۰، “” و [] برابر با true هستند. در سی عبارت ۰: ۱ ? ۰ برابر با صفر (همان false) است درحالیکه در روبی نتیجه آن ۱ است زیرا تمام اعداد برابر true هستند و فقط nil و false برابر false هستند. یک نتیجه فرعی از این عمل آنست که در روبی متدها بر طبق قرارداد -- برای مثال یک جستجوی regular-expression – در صورت موفقیت اعداد، رشتهها، لیستها یا سایر مقادیر غیر false را برمیگردانند، و در صورت شکست nil برمیگردانند. این قرارداد در اسمالتاک هم بکار میرود که تنها اشیاء مخصوص true و false میتوانند در عبارات بولین استفاده شوند.
- در نسخههای ماقبل از ۱٫۹ عدم وجود نوع داده کاراکتر (در مقایسه با سی که نوع داده char را برای کاراکترها داراست) ممکن غافلگیرکننده باشد. در هنگام بریدن رشتهها [۰]“abc” مقدار ۹۷ را برمیگرداند (یک integer که شماره کد اسکی اولین حرف رشتهاست)، برای بهدست آوردن “a” باید از [۰٬۱]“abc” (یک زیر رشته بطول ۱) یا "abc"[0].chr استفاده کرد.
در ضمن برخی مسائل در مورد خود زبان برجسته است:
- در مورد سرعت، عملکرد روبی در قیاس با بسیاری از زبانهای کامپایل شده پایینتر است (همانند هر زبان تفسیر شده دیگر) و همچنین در قیاس با زبانهای اسکریپتنویسی اصلی مانند پرل و پایتون همین حالت وجود دارد. هرچند که در نسخههای آینده روبی به صورت بایت کد (bytecode) کامپایل خواهد شد و بر روی YARV (خلاصه Yet Another Ruby VM) اجرا خواهد شد. در حال حاضر حافظه بکار رفته در برنامههای نوشته شده در روبی کمتر از حافظه بکار رفته در همان برنامهها که با پرل و پایتون نوشته شدهاند، است.
- حذف پرانتزهای متدها در روبی ممکن است به نتایج غیرمنتظرهای در متدهایی با چند آرگومان منتج شود. توجه کنید که توسعه دهندگان روبی اشاره کردهاند که حذف پرانتزها در متدهایی با چند آرگومان در آینده ممنوع خواهد شد. در هر صورت حذف پرانتزها در متدهای تک آرگومان توصیه میشود.
مثالها
[ویرایش]مثال کلاسیک Hello world:
puts "Hello World!"
مقداری کد اساسی روبی:
# Everything, including a literal, is an object, so this works:
-199.abs # 199
"ruby is cool".length # 12
"Rick".index("c") # 2
"Nice Day Isn't It?".split(//).uniq.sort.join # " '?DINaceinsty"
Collections
[ویرایش]ایجاد و استفاده از یک آرایه:
a = [1, 'hi', 3.14, 1, 2, [4, 5]]
a[2] # 3.14
a.reverse # [[4, 5], 2, 1, 3.14, 'hi', 1]
a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5]
ایجاد و استفاده از یک هش:
hash = {:water => 'wet', :fire => 'hot'}
puts hash[:fire] # Prints: hot
hash.each_pair do |key, value| # Or: hash.each do |key, value|
puts "#{key} is #{value}"
end
# Prints: water is wet
# fire is hot
hash.delete_if {|key, value| key == water} # Deletes :water => 'wet'
Blocks and iterators
[ویرایش]هر دو سینتکس برای ایجاد یک بلوک کد:
{ puts "Hello, World!" }
== do puts "Hello, World!" end ==
ارسال پارامتر به یک بلاک تا یک closure شود:
# In an object instance variable, remember a block.
def remember(&b)
@block = b
end
# Invoke the above method, giving it a block that takes a name.
remember {|name| puts "Hello, #{name}!"}
# When the time is right (for the object) -- call the closure!
@block.call("John")
# Prints "Hello, John!"
بازگشت closure از یک متد:
def foo(initial_value=0)
var = initial_value
return Proc.new {|x| var = x}, Proc.new { var }
end
setter, getter = foo
setter.call(21)
getter.call # => 21
دادن جریان کنترل یک برنامه به یک بلوک که در هنگام فراخوانی ایجاد شده:
def a
yield "hello"
end
# Invoke the above method, passing it a block.
a {|s| puts s} # Prints: 'hello'
# Perhaps the following needs cleaning up.
# Breadth-first search
def bfs(e) # 'e' should be a block.
q = [] # Make an array.
e.mark # 'mark' is a user-defined method. (??)
yield e # Yield to the block.
q.push e # Add the block to the array.
while not q.empty? # This could be made much more Ruby-like.
u = q.shift
u.edge_iterator do |v|
if not v.marked? # 'marked?' is a user-defined method.
v.mark
yield v
q.push v
end
end
end
end
bfs(e) {|v| puts v}
ایجاد حلقه بر روی آرایهها و enumorationها با استفاده از بلوکها:
a = [1, 'hi', 3.14]
a.each {|item| puts item} # Prints each element
(3..6).each {|num| puts num} # Prints the numbers 3 through 6
[1,3,5].inject(0) {|sum, element| sum + element} # Prints 9 (you can pass both a parameter and a block)
بلوکها با بسیاری از متدهای داخلی روبی کار میکنند:
File.open('file.txt', 'w+b') do |file|
file.puts 'Wrote some text.'
end # File is automatically closed here
یا:
File.readlines('file.txt').each do |line|
# Process each line, here.
end
استفاده از یک enumoration و یک بلوک برای جذر گرفتن اعداد ۱ تا ۱۰:
(1..10).collect {|x| x*x} => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
کلاسها
[ویرایش]کد زیر یک کلاس بنام Person را تعریف میکند.
class Person
def initialize(name, age)
@name, @age = name, age
end
def <=>(person)
@age <=> person.age
end
def to_s
"#{@name} (#{@age})"
end
attr_reader :name, :age
end
group = [ Person.new("John", 20),
Person.new("Markus", 63),
Person.new("Ash", 16)
]
puts group.sort.reverse
کد بالا سه نام را بر حسب سن از زیاد به کم چاپ میکند:
Markus (63)
John (20)
Ash (16)
استثناها
[ویرایش]یک استثنا (exception) توسط اعلان raise ایجاد میشود:
raise
یک پیام اختیاری میتواند به استثناء اضافه شود:
raise "This is a message"
شما همچنین میتوانید تعیین کنید که چه نوعی از استثناء را میخواهید ایجاد کنید:
raise ArgumentError, "Illegal arguments!"
استثناها توسط rescue کنترل میشوند. این عنوان میتواند استثناهایی را که از StandardError مشتق میشوند بگیرد:
begin
# Do something
rescue
# Handle exception
end
توجه داشته باشید که تلاش برای گرفتن تمام استثناها توسط یک rescue یک اشتباه معمول است و برای گرفتن تمام استثناها باید به صورت زیر عمل کرد:
begin
# Do something
rescue Exception
# Handle exception
end
یا یک استثنای بهخصوص:
begin
# ...
rescue RuntimeError
# handling
end
و نهایتاً امکان آن وجود دارد که تعیین کرد شی استثناء برای عنوان کنترلکننده مهیا شود:
begin
# ...
rescue RuntimeError => e
# handling, possibly involving e
end
همچنین آخرین استثناء در یک متغیر جهانی به صورت !$ ذخیره میشود.
پیادهسازیها
[ویرایش]روبی دو پیادهسازی اصلی دارید: مفسر رسمی روبی که بیشتر مورد استفاده قرار میگیرد، و JRuby که یک پیادهسازی براساس جاوا است.
سیستمعاملها
[ویرایش]روبی برای سیستمعاملهای زیر ارائه میشود:
- بیشتر انواع یونیکس
- لینوکس
- داس (رایانه)
- ویندوز ۹۵/۹۸/اکسپی/انتی/۲۰۰۰/ویستا/۷
- مکینتاش OSX
- بی اواس
- آمیگا
- مورف اواس
- Acron RISC OS
- اواس/۲
- هجا
پیادهسازیهای دیگر نیز ممکن است وجود داشته باشد.
اجازهنامه
[ویرایش]مفسر روبی و کتابخانههای آن تحت مجوز دوگانه آزاد و باز متن GPL و اجازهنامه روبی منتشر شدهاست.
منابع و کتابخانهها
[ویرایش]آرشیو برنامههای روبی (RAA) و همچنین RubyForge منابعی برای انواع مختلف برنامهها و کتابخانههای نوشته شده با روبی هستند که حاوی بیش از دو هزار آیتم هستند. با اینکه تعداد برنامههای موجود قابل قیاس با تعداد برنامههای موجود در پرل و پایتون نیست، ولی طیف وسیعی از ابزارهای مختلف برای توسعه سریع روبی موجود است. RubyGems برنامه استاندارد مدیریت بستهها برای کتابخانههای روبی است و بسیار شبیه به CPAN در پرل است، همچنین نحوه استفاده از آن بیشتر شبیه ابزار [apt-get] در لینوکس دبیان است.
همچنین، روبی انجمنهای فعال و گستردهای برای کمک به علاقهمندان به این زبان دارد. در ایران نیز انجمن IranOnRails فعالترین انجمن فارسیزبان روبی و همچنین روبی آن ریلز است.
جستارهای وابسته
[ویرایش]منابع
[ویرایش]
- ↑ "روبی ۳٫۰٫۰ منتشر شد". زبان برنامهنویسی روبی. 25 December 2020. Retrieved 25 December 2020.
- ↑ "[ruby] Contents of /trunk/COPYING". Archived from the original on 20 March 2017. Retrieved 2 May 2015.
- ↑ "[ruby] Contents of /trunk/GPL". Archived from the original on 21 March 2022. Retrieved 2 May 2015.
- ↑ "[ruby] Contents of /trunk/BSDL". Archived from the original on 21 March 2022. Retrieved 2 May 2015.
- ↑ ۵٫۰ ۵٫۱ ۵٫۲ Cooper, Peter (2009). Beginning Ruby: From Novice to Professional. Beginning from Novice to Professional (2nd ed.). Berkeley: APress. p. 101. ISBN 1-4302-2363-4.
To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby.
- ↑ ۶٫۰ ۶٫۱ ۶٫۲ ۶٫۳ ۶٫۴ ۶٫۵ Bini, Ola (2007). Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java. Berkeley: APress. p. 3. ISBN 1-59059-881-4.
It draws primarily on features from Perl, Smalltalk, Python, Lisp, Dylan, and CLU.
- ↑ "Intro - D Programming Language 1.0 - Digital Mars". Digital Mars. Retrieved 2014-10-21.
D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python.
- ↑ Bini, Ola. "Ioke". Ioke.org. Archived from the original on 21 July 2011. Retrieved 2011-07-21.
inspired by Io, Smalltalk, Lisp and Ruby
- ↑ "Introduction — Julia Language 0.4.1 documentation". Archived from the original on 17 November 2015. Retrieved 13 November 2015.
- ↑ Burks, Tim. "About Nu™". Programming Nu™. Neon Design Technology, Inc. Archived from the original on 24 July 2011. Retrieved 2011-07-21.
- ↑ Lattner, Chris (2014-06-03). "Chris Lattner's Homepage". Chris Lattner. Retrieved 2014-06-03.
The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
- ↑ "Download Ruby" (به انگلیسی). وبگاه رسمی زبان روبی.
- ↑ "Ruby 2.0 Implementation Work Begins: What is Ruby 2.0 and What's New?" (به انگلیسی).
- ↑ (به انگلیسی) http://www.rubyinside.com/ruby-2-0-release-schedule-announced-roll-on-2013-5536.html.
{{cite web}}
: Missing or empty|title=
(help) - ↑ "Ruby 2.4.0 Released". www.ruby-lang.org. Retrieved 2016-12-30.
- ↑ "Ruby 2.5.0 Released". Retrieved 2018-05-02.
- ↑ "Ruby 2.6.0 Released". Ruby Programming Language. 2018-12-25. Retrieved 2018-12-25.
- ↑ "Ruby 2.7.0 Released". Ruby Programming Language. 2019-12-25. Retrieved 2019-12-25.
- ↑ "Ruby 3.0.0 Released". Ruby Programming Language. 2020-12-25. Retrieved 2020-12-25.
- ↑ www.rubyinside.com http://www.rubyinside.com/the-ruby-communitys-christmas-releases-4118.html/.
{{cite web}}
: Missing or empty|title=
(help) - ↑ A Patch in Time: Securing Ruby
- ↑ ruby-1.8.0 released!
- ↑ Plans for 1.8.7
- ↑ EOL for Ruby 1.8.7 and 1.9.2
- ↑ Ruby 1.9.3-p551 Released
- ↑ Ruby 1.9.0 Released
- ↑ Support for Ruby version 1.9.3 will end on February 23, 2015
- ↑ Support for Ruby 1.9.3 has ended
- ↑ ۲۹٫۰ ۲۹٫۱ ۲۹٫۲ Ruby 2.0.0-p648 Released
- ↑ Ruby 2.0.0-p0 is released
- ↑ Ruby 2.1.10 Released
- ↑ Ruby 2.1.0 is released
- ↑ Support plans for Ruby 2.0.0 and Ruby 2.1
- ↑ Ruby 2.1.9 Released
- ↑ «Release Engineering». بایگانیشده از اصلی در ۲۷ فوریه ۲۰۱۷. دریافتشده در ۹ ژانویه ۲۰۱۷.
- ↑ "Ruby 2.2.10 Released". www.ruby-lang.org.
- ↑ Ruby 2.2.0 Released
- ↑ Support of Ruby 2.1 has ended
- ↑ Ruby 2.2.7 Released
- ↑ "Ruby 2.3.8 Released". www.ruby-lang.org.
- ↑ "Ruby 2.3.0 Released". www.ruby-lang.org.
- ↑ ۴۲٫۰ ۴۲٫۱ "Support of Ruby 2.2 has ended". www.ruby-lang.org.
- ↑ "Ruby 2.4.10 Released". Ruby Programming Language. 2020-03-31. Retrieved 2020-04-01.
- ↑ "Ruby 2.4.0 Released". www.ruby-lang.org.
- ↑ ۴۵٫۰ ۴۵٫۱ "Support of Ruby 2.4 has ended". www.ruby-lang.org.
- ↑ "Ruby 2.5.8 Released". Ruby Programming Language. 2020-03-31. Retrieved 2020-04-01.
- ↑ Ruby Roadmap
- ↑ "Ruby 2.6.6 Released". Ruby Programming Language. 2020-03-31. Retrieved 2020-04-01.
- ↑ "Ruby 2.6.0 Released". www.ruby-lang.org.
- ↑ "Ruby 2.7.2 Released". Ruby Programming Language. 2020-10-02. Retrieved 2020-10-02.
- ↑ "Ruby 2.7.0 Released". www.ruby-lang.org.
- ↑ "Ruby 3.0.0 Released". Ruby Programming Language. 2020-12-25. Retrieved 2020-12-25.
- ↑ "Ruby 3.0.0 Released". www.ruby-lang.org.
پیوند به بیرون
[ویرایش]
- وبگاه رسمی
- مستندات رسمی روبی
- Ruby User Guide - توسط سازنده روبی یوکیهیرو ماتسوموتو
- Ruby From Other Languages
- Ruby Forum - gateway to the ruby-talk mailing list
- Try Ruby! - web-based Ruby REPL
- Ruby Draft Specification, September 2010
- Ruby در کرلی
- روبی (زبان برنامهنویسی)
- استانداردهای ایزو
- زبانهای اسکریپتنویسی
- زبانهای برنامهنویسی دارای استاندارد ایزو
- زبانهای برنامهنویسی ساختهشده در ۱۹۹۵ (میلادی)
- زبانهای برنامهنویسی شیءگرا
- زبانهای برنامهنویسی کلاس محور
- زبانهای برنامهنویسی ماشینی پویا
- کامپایلرها و مفسرهای آزاد
- نرمافزارهای آزاد نوشتهشده با سی
- نرمافزارهایی که از پروانه بیاسدی استفاده میکنند
- زبانهای برنامهنویسی متنگرا
- اختراعهای ژاپنی
- زبانهای تابعی