آشنایی با Ruby
فهرست مطالب
آخرین به روزرسانی در 29/07/2022
با یکی دیگر از مقالات حوزه ی برنامه نویسی با شما هستیم.
و اینبار در این مقاله قصد داریم ، با زبان برنامه نویسی ruby آشنا شویم.
شاید این زبان برای بسیاری از افراد ناشناخته باشد ، اما زبانی است که در چند سال اخیر به خوبی توانسته است خودرش را در بین توسعه دهندگان جای دهد.
ما در این مقاله قصد آموزش این زبان را نداریم ، صرفا قصد یک معرفی و یک آموزش کلی در رابطه با آن را داریم.
از کاربردها و مزایای آن خواهیم گفت تا ساختار این زبان.
با ما همراه باشید.
نیاز شما به این مقاله : این مقاله به علاقه مندان حوزه ی برنامه نویسی پیشنهاد می شود.
و یا کسانی که قصد یادگیری یک زبان برنامه نویسی را دارند و نام روبی برای آن ها آشناست ، پیشنهاد می شود با خواندن این مقاله به شکل کامل ترین با این زبان و مزایای آن آشنا شوند.
آشنایی با Ruby
روبی یک زبان شی گرا خالص است که توسط یوکیهیرو ماتسوموتو در اواسط دهه 1990 در ژاپن توسعه یافت.
همه چیز در روبی یک شی است به جز بلوک ها ، اما جایگزین هایی نیز برای آن وجود دارد ، مانند procs و lambda.
هدف از توسعه روبی این بود که آن را به عنوان یک بافر معقول بین برنامه نویسان انسانی و ماشین های محاسباتی زیربنایی عمل کند.
Ruby دارای سینتکسی مشابه با بسیاری از زبان های برنامه نویسی مانند C و Java است ، بنابراین یادگیری آن برای برنامه نویسان جاوا و C آسان است.
این بیشتر از تمام سیستم عامل ها مانند ویندوز، مک، لینوکس پشتیبانی می کند.
Ruby بر اساس بسیاری از زبان های دیگر مانند Perl، Lisp، Smalltalk، Eiffel و Ada است.
این یک زبان برنامه نویسی تفسیر شده است که به این معنی است که بیشتر پیاده سازی های آن دستورالعمل ها را مستقیماً و آزادانه اجرا می کنند، بدون اینکه قبلاً برنامه ای را در دستورالعمل های زبان ماشین کامپایل کرده باشند.
برنامه نویسان Ruby همچنین به RubyGems قدرتمند دسترسی دارند (RubyGems یک قالب استاندارد برای برنامه ها و کتابخانه های Ruby ارائه می دهد).
مزایای روبی
کد نوشته شده در Ruby کوچک ، ظریف و قدرتمند است زیرا تعداد خطوط کد کمتری دارد.
Ruby امکان ایجاد ساده و سریع برنامه های کاربردی وب را فراهم می کند که منجر به کار کمتری می شود.
از آنجایی که Ruby رایگان است، یعنی Ruby برای کپی، استفاده، اصلاح رایگان است، به برنامه نویسان اجازه می دهد تا در صورت لزوم تغییرات لازم را انجام دهند.
Ruby یک زبان برنامه نویسی پویا است که بسیار نزدیک به زبان های گفتاری است.
Ruby یک زبان منعطف است که به راحتی می توانید قطعات موجود را حذف، تعریف مجدد یا اضافه کنید.
این به کاربران خود اجازه می دهد تا آزادانه قطعات آن را همانطور که می خواهند تغییر دهند.
روبی دارای ویژگی single inheritance است.
روبی دارای کلاس ها و همچنین ماژول های متعددی است.
یک ماژول متد دارد اما نمونه ندارد.
در عوض، یک ماژول را می توان در یک کلاس ترکیب کرد، که متد آن ماژول را به کلاس اضافه می کند.
این شبیه به ارث بری است اما بسیار انعطاف پذیرتر می باشد.
معایب روبی
کدهایی که در Ruby نوشته شده است برای اشکالزدایی سختتر است ، زیرا اکثر اوقات در زمان اجرا تولید میشوند ، بنابراین خواندن آن در حین اشکالزدایی دشوار میشود.
روبی در مقایسه با سایر زبان های برنامه نویسی منابع اطلاعاتی زیادی ندارد.
روبی یک زبان برنامه نویسی تفسیر شده است، زبان های اسکریپت معمولاً کندتر از زبان های کامپایل شده هستند، بنابراین، روبی از بسیاری از زبان های دیگر کندتر است.
کاربرد روبی
Ruby برای ایجاد برنامه های کاربردی وب در انواع مختلف استفاده می شود.
این یکی از فناوری های داغ در حال حاضر برای ایجاد برنامه های کاربردی وب است.
روبی یک ویژگی عالی به نام Ruby on Rails (RoR) ارائه می دهد.
این یک چارچوب وب است که توسط برنامه نویسان برای سرعت بخشیدن به فرآیند توسعه و صرفه جویی در زمان استفاده می شود.
ویژگی های روبی
ما به طور کلی در بخش مزایای روبی به بسیاری از ویژگی های نیز پرداختیم.
و در این بخش سایر ویژگی های آن را شرح می دهیم که تعریف مزیت را ندارند.
۱- روبی به طور کلی کلمه کلیدی انگلیسی را ترجیح می دهد و برخی از علائم نگارشی برای تزئین روبی استفاده می شود.
به همین علت نیازی به اعلان متغیر ندارد.
۲- روبی یک زبان برنامه نویسی پویا است.
برنامه های روبی کامپایل نمی شوند.
تمام کلاس ها، ماژول ها و تعریف های متد توسط کد هنگام اجرا ساخته می شوند.
متغیرهای روبی زبانی با تایپ آزاد هستند ، به این معنی که هر متغیری می تواند هر نوع شی را در خود جای دهد.
هنگامی که یک متد بر روی یک شیء فراخوانی می شود، Ruby صرف نظر از نوع شیء، فقط به نام آن نگاه می کند.
این به شما امکان می دهد کلاس هایی بسازید که وانمود می کنند کلاس های دیگر هستند.
۳- در روبی، ثابت ها واقعا ثابت نیستند.
اگر یک ثابت اولیه در یک اسکریپت اصلاح شود، به سادگی یک اخطار ایجاد می کند اما برنامه شما را متوقف نمی کند.
۴- روبی برخی از قراردادهای نامگذاری را برای متغیر، متد، ثابت و کلاس خود تعریف می کند.
ثابت : با حرف بزرگ شروع می شود.
متغیر جهانی : با علامت دلار ($) شروع می شود.
متغیر نمونه : با علامت (@) شروع می شود.
متغیر کلاس : با علامت (@@) شروع می شود.
نام متد : مجاز است با حرف بزرگ شروع شود.
۵- متدها مجاز هستند با علامت سوال (؟) یا علامت تعجب (!) خاتمه پیدا کنند.
طبق قرارداد ، متدهایی که به سؤالات پاسخ میدهند با علامت سؤال خاتمه مییابند و آن متد میتواند وضعیت شی را تغییر دهد و با علامت تعجب خاتمه مییابد.
۶- هر شی در Ruby دارای دو کلاس است : یک کلاس معمولی و یک کلاس singleton.
کلاس سینگلتون یک شی، کلاس بی نامی است که تنها نمونه آن همان شی است.
کلاس های Singleton به طور خودکار ایجاد می شوند و Ruby را ساده و زیبا می کنند.
۷- برنامه نویس نیازی به تعریف متغیرها یا محدوده متغیر در روبی ندارد.
نام متغیر به طور خودکار محدوده آن را تعیین می کند.
۸- Multiple statements در یک خط باید حاوی سمیکولن در between باشد اما نه در انتهای یک خط.
۹- روبی یک زبان حساس به حروف کوچک و بزرگ است.
حروف کوچک و بزرگ متفاوت هستند.
نوشتن برنامه در روبی
برنامه ها را می توان در Ruby در هر یک از ویرایشگرهای متنی پرکاربرد مانند Notepad++ ، gedit و … نوشت و سپس از کامپایلر برای اجرای آن ها استفاده کرد.
پس از آن نوشتن برنامه ها فایل را با پسوند rb ذخیره کنید.
مثال چندین سینتکس در روبی :
puts برای چاپ چیزی روی کنسول در Ruby استفاده می شود. برای مثال ، یک رشته :
puts "Hello World"
puts "Hello Again"
# در روبی pound character نامیده می شود و برای اضافه کردن نظرات به کد شما استفاده می شود.
begin, =end= برای نظرات چند خطی استفاده می شود.
# this is a comment and wont be executed
= begin
this is
a multi line
comment in ruby
= end
توابع ریاضی ساده را میتوان در دستورات puts انجام داد.
همانطور که از «%d» یا «%f» و «&» در C استفاده میکنیم،
از {}# در Ruby نیز برای انجام کار خود استفاده میکنیم.
puts "Alok has #{25+30/6} Rupees in his pocket"
متغیرهای روبی مانند هر زبان برنامه نویسی پویا دیگری هستند.
شما فقط نیازی به ذکر نوع آن ندارید و زبان برنامه نویسی روبی به طور خودکار نوع آن را می شناسد.
cars = 100
drivers = 30
puts "There are #{cars} cars and #{drivers} drivers."
“gets.chomp” برای دریافت ورودی از کاربر استفاده می شود.
از «print» میتوان بهجای «puts» برای چاپ بدون خط جدید استفاده کرد.
print "How old are you ? "
age = gets.chomp
print "How tall are you ?"
height = gets.chomp
puts " You are #{age} year old and your height is #{height} cms"
gets.chomp.to_i برای دریافت ورودی اعداد صحیح از کاربر استفاده می شود.
gets.chomp.to_f برای دریافت ورودی float (اعشاری) از کاربر استفاده می شود.
print "Give a number"
number = gets.chomp.to_i
puts "You just entered #{number}"
این ها تنها چند مثال بسیار ساده و ابتدایی از روبی بود که شما صرفا با شماتیک کوچکی از این زبان آشنا شوید.
آموزش نصب روبی و یک آشنایی اجمالی با کدها
ما به عنوان آخرین بخش از این آشنایی قصد داریم که نصب روبی را آموزش دهیم و یک آشنایی اجمالی با بخش کدینگ آن داشته باشیم.
توصیه می کنیم از Ruby نسخه 2.5.x، 2.6.x یا 2.7.x استفاده کنید.
ما Ruby 2.7.5 را به عنوان بهترین انتخاب پیشنهاد می کنیم.
اگر روی یک دستگاه مک یا لینوکس کار می کنید ، ممکن است Ruby را قبلاً نصب کرده باشید.
به خط فرمان یا برنامه ترمینال خود بروید و ruby -v را وارد کنید.
باید چاپی از نسخه Ruby که روی دستگاه شما نصب شده است را ببینید.
برخی از نصبهای روبی سیستم ، بهویژه در مک، مجوزهای محدودی دارند و توانایی شما را برای نصب جم، ارتقا Ruby و انجام سایر وظایف توسعهای مختل میکنند.
بنابراین ، با وجود اینکه سیستم شما با روبی عرضه می شود ، باز هم باید Ruby را دوباره نصب کنید.
اگر به داکیومنشن رسمی نصب روبی مراجعه کنید ، خواهید دید که ۴ انتخاب وجود دارد :
- rvm
- rbenv
- Homebrew (Mac only)
- Build from source
اگر از نظر فنی تمایل دارید، می توانید rvm یا rbenv را امتحان کنید.
اینها مدیران نسخه Ruby هستند که به شما امکان می دهند نسخه های مختلف روبی را در کنار هم اجرا کنید و به شما اجازه می دهند آزادانه بین آنها جابجا شوید.
اگر در خط فرمان مهارت ندارید و نمی توانید مشکلات نصب را به تنهایی رفع اشکال کنید، از rvm یا rbenv استفاده نکنید.
Build from source نیز برای مبتدیان ایده خوبی نیست.
که کاربران مک را با یک انتخاب باقی می گذارد: نصب با Homebrew.
اگر از دستگاه ویندوزی استفاده می کنید، توصیه می کنیم از RubyInstaller برای نصب Ruby استفاده کنید.
RubyGems با Ruby 1.9.3 و بالاتر عرضه می شود، بنابراین پس از نصب Ruby می توانید از ترمینال با gem -v تأیید کنید.
باید چاپی از نسخه RubyGems که استفاده می کنید ببینید.
قبل از شروع، مطمئن شوید که تایپ ruby -v در ترمینال شما نسخه 1.9.3 یا بالاتر را برمی گرداند.
خواندن داکیومنت ها :
همانطور که سفر خود را برای تبدیل شدن به یک برنامه نویس آغاز می کنید، یکی از مهم ترین عادت هایی که باید ایجاد کنید، یادگیری نحوه خواندن داکیومنت ها است.
روبی، مانند همه زبان های برنامه نویسی محبوب، دارای مجموعه ای غنی از کتابخانه های استاندارد است که می توانید از آنها استفاده کنید.
با این حال، برای آشنایی با کلاسها و متدهای مختلف در دسترس شما ، باید داکیومنت های روبی را مطالعه کنید.
در اولین دایره در بالا، کلمه “String” را می بینیم.
این کلاس یا ماژول است .
در برخی از داکیومنت ها ، نام کلاس را با علامت :: میبینید، مانند : Encoding::Converter. در اینجا ، نماد :: برای تعریف namespace استفاده می شود، که فقط راهی برای گروه بندی کلاس ها در Ruby و متمایز کردن از کلاس های دیگر با همین نام است.
به عنوان مثال ActiveRecord::Base به کلاس Base در ماژول ActiveRecord اشاره می کند تا از کلاس های دیگر که Base نیز نامیده می شوند متمایز شود.
با این حال، وقتی به لیست متدها در نوار کناری نگاه می کنیم، :: به معنای چیز دیگری است.
: به این معنی است که متد بعد از :: یک متد کلاس است.
در حال حاضر ، فقط توجه داشته باشید که چه عنوان بالای عبارت String یا Encoding::Converter باشد، به نام کلاس یا ماژول اشاره دارد و بقیه صفحه آن کلاس یا ماژول را مستند می کند.
متدها
متد ها با یک :: یا یک # برای نشان دادن دو نوع مختلف از متدهای در دسترس عموم (public) فهرست میشوند.
متدهایی که با :: نشان داده می شوند، متدهای کلاس در نظر گرفته می شوند، در حالی که متدهایی که با # نشان داده می شوند، متدهای نمونه در نظر گرفته می شوند.
فراتر از داکیومنت ها ، درگیر این نمادها نشوید زیرا هنگام اجرای کد روبی معانی کاملا متفاوتی دارند.
به عنوان مثال، نماد :: به عنوان namespace در کد روبی واقعی استفاده می شود، در حالی که # به عنوان یک کامنت استفاده می شود.
استفاده از آنها در داکیومنت های روبی کاملاً متفاوت از استفاده آنها در کد واقعی است.
داکیومنت های روبی برای کلاس String، متد های کلاس عمومی و متد های نمونه عمومی را شرح میدهد.
با کلیک بر روی یکی از این متد ها به بخش آن در صفحه پیوند داده میشود که پارامترها ، مقادیر بازگشتی و چند کد نمونه را نشان میدهد که میتوانید آن را کپی و جایگذاری کنید.
مثال : متدهای نمونه در مقابل متدهای کلاس
نکته مهم از این داکیومنشن این است که متدهای نمونه پابلیک را میتوان برای هر نمونه از کلاس اعمال کرد.
میتوانیم به رشته «world wide web» نگاه کنیم و متدهای نمونه را مستقیماً روی آن اعمال کنیم.
به عنوان مثال، از نوار کناری لیست متد ، می بینیم که یک متد split# برای رشته ها وجود دارد، به این معنی که split یک متد نمونه است و می توانیم آن متد را مستقیماً روی هر رشته ای فراخوانی کنیم:
irb :001 > "world wide web".split
=> ["world", "wide", "web"]
علاوه بر این، میتوانیم از نوار کناری متدها ببینیم که دو متد کلاس وجود دارد :
new:: و try_convert:: متدهای کلاس عمومی مستقیماً از کلاس فراخوانی می شوند.
irb :001 > b = String.new("blue")
=> "blue"
irb :002 > String.try_convert("red")
=> "red"
در حال حاضر، این سه نکته مهمی است که باید هنگام خواندن داکیومنشن Ruby به خاطر بسپارید :
- کلاس یا ماژولی که به آن نگاه می کنید
- متد های کلاس موجود
- متد های نمونه موجود آن و نحوه استفاده از آن متدها
دانستن نحوه خواندن متدهای کلاس به شما کمک می کند تا با کد Ruby بازی کنید و تسلط خود را افزایش دهید.
Parent
در Ruby هر کلاسه ساب کلاس از “parent” می باشد.
نکته ای که باید درک کنید این است که کلاسی که شما به آن نگاه می کنید به متدهایی ، هم نمونه و هم کلاس ، که در کلاس والد مستند شده اند دسترسی دارد.
بنابراین در این مثال ، والد کلاس String Object است.
این بدان معنی است که علاوه بر متدهای توضیح داده شده در این doc ، متدهای Object نیز برای رشته ها در دسترس هستند.
Class/Module Index
همه کلاس ها بخشی از یک namespace در Ruby هستند و این منو لیستی از همه کلاس ها و ماژول های دیگر است که بخشی از namespace مشابه کلاس فعلی هستند.
اگر به لیست نگاه کنید ، می توانید همان کلاس String را ببینید که به داکیومنت پیوند می دهد.
ممکن است مواردی را در این لیست مشاهده کنید که از نماد :: نیز استفاده می کنند.
در این مورد ، از :: برای نشان دادن namespace مانند Math::DomainError استفاده می کند.
Included Modules
ماژول های شامل ماژول های اضافی را نشان می دهد که عملکرد آنها برای کلاس String در دسترس است.
در مثال String ، ماژول Comparable گنجانده شده است.
این بدان معنی است که ما می توانیم کاری شبیه به این انجام دهیم :
irb 001 > "cat".between?("ant", "zebra")
=> true
پس ? between چه می شود ؟
این متد در داکیومنت کلاس String فهرست نشده است.
با این حال ، اگر به ماژول Comparable لینک شده نگاه کنیم، ? between متد لیست شده است.
استفاده از Command Line و irb
این بخش فقط یک لیست اساسی از دستورات را در اختیار شما قرار می دهد که از آنها برای اجرا و آزمایش کد Ruby استفاده خواهید کرد.
این به هیچ وجه یک لیست جامع نیست و فقط حداقل های مورد نیاز است.
این بخش همچنین نحوه استفاده از ترمینال تعاملی Ruby – irb را پوشش می دهد.
اینجاست که میتوانید تکههای کد Ruby را در ترمینال آزمایش کنید.
نکته ای برای کاربران ویندوز : دستورات ترمینال که در زیر نشان می دهیم ممکن است در ترمینال پیش فرض ویندوز کار نکنند.
اکثر توسعه دهندگان ویندوز از یک شبیه ساز ترمینال یا جایگزینی مانند Powershell استفاده می کنند.
ما به همه توسعه دهندگان ویندوز توصیه می کنیم با شبیه ساز ترمینال یا Powershell آشنا شوند و دستورات زیر را در آنجا بنویسند.
Command Line
برای ایجاد دایرکتوری (یا پوشه) به نام “new_dir” دستور زیر را تایپ کنید:
$ mkdir new_dir
برای رفتن به پوشه ای که ایجاد کرده اید:
$ cd new_dir
برای ایجاد فایلی به نام “new_file”:
$ touch new_file.rb
برای حذف فایلی که ایجاد کرده اید:
$ rm new_file.rb
برای حرکت به خارج از پوشه فعلی به پوشه بالا:
$ cd ..
برای حذف دایرکتوری که ایجاد کرده اید:
$ rmdir new_dir
اکنون، دوباره دایرکتوری و فایل را مانند آنچه در بالا انجام دادید ایجاد کنید.
برای حذف همزمان دایرکتوری و فایل، به دایرکتوری بالای “new_dir” بروید و دستور زیر را تایپ کنید:
$ rm -R new_dir
با دستور rm خیلی محطاتانه کار کنید.
این بسیار مخرب است و هیچ راهی برای بهبودی از آن وجود ندارد.
به همین خاطر با احتیاط از آن استفاده کنید.
اگر شک دارید ، از برنامه file navigation خود (مانند اکسپلورر یا Finder) استفاده کنید و فایل ها و پوشه ها را از این طریق حذف کنید.
Ruby دارای یک محیط تعاملی داخلی به نام “irb” است که می تواند هنگام نوشتن کد Ruby بسیار مفید باشد. در command line تایپ کنید:
$ irb
این یک اعلان تولید می کند که چیزی شبیه به این است:
2.5.3p-247 :001 >
2.5.3p-247 به ما می گوید که چه نسخه ای از Ruby را اجرا می کنیم و 001: به ما می گوید در چه خطی هستیم.
با این حال، در سراسر این آموزش ما به دستور irb به صورت زیر اشاره خواهیم کرد :
irb :001 >
می توانید دستور Ruby را بعد از دستور قبلی تایپ کنید و خروجی آن و آنچه را که برمی گرداند را ببینید.
به عنوان مثال، اگر دستور زیر را تایپ کرده و return را فشار دهید تا اجرا شود :
irb :001 > puts 'hello world!'
خروجی چیزی شبیه به این خواهد بود:
irb :001 > puts 'hello world!'
hello world!
=> nil
irb :002 >
تنها چیزی که اکنون باید بدانید این است که می توانید کد را در محیط تعاملی Ruby، irb، آزمایش کنید، زمانی که در مورد یک قطعه کد خاص شک دارید.
همچنین یک مکان عالی برای تمرین است.
هنگامی که می خواهید irb را به خط فرمان خارج کنید ، فقط exit را تایپ کنید.
توجه داشته باشید که اگر exit را از command line تایپ کنید ، از shell خارج می شود ، به این معنی که باید برنامه command line خود را دوباره راه اندازی کنید.
اجرای Ruby Code
هنگامی که یک فایل Ruby ایجاد کردید که با پسوند rb مشخص می شود، می توانید کد را در آن فایل با تایپ دستور ruby و سپس نام فایل در خط فرمان اجرا کنید.
خط زیر نحوه اجرای کد از فایلی به نام example.rb را نشان می دهد.
$ ruby example.rb
با فرض اینکه فایل example.rb فقط حاوی خط «!hello world» باشد، پس از اجرای فایل، موارد زیر چاپ میشوند.
$ ruby example.rb
hello world!
$
هنگامی که یک فایل Ruby را از خط فرمان اجرا می کنید، کد توسط چیزی که interpreter (مفسر) نامیده می شود اجرا می شود.
شما نیازی به دانستن چیزهای زیادی در مورد interpreter ندارید ، به جز این واقعیت که کد Ruby را می گیرد و آن را به کدی تبدیل می کند که رایانه شما آن را درک کند.
آخرین نکته این است که چگونه یک برنامه در حال اجرا را متوقف کنید.
گاهی اوقات، شما یک برنامه Ruby طولانی در حال اجرا یا خطا در منطق دارید که منجر به یک حلقه بی نهایت می شود.
برای خروج از حلقه اجرای برنامه، از control-c استفاده کنید.
این یک سیگنال قطع به برنامه در حال اجرا ارسال می کند.
دیباگ گیری روبی با استفاده از Pry
Pry یک کتابخانه بسیار خوب است که با مجموعه ای از ویژگی های عالی به عنوان جایگزینی برای irb عمل می کند.
در این بخش، بر روی قابلیتهای اشکال زدایی کد آن تمرکز خواهیم کرد.
برای استفاده از pry ابتدا باید آن را نصب کنیم :
gem install pry
این دستور pry را به شما می دهد که با وارد کردن آن در ترمینال شما یک سشن جدید درست مانند irb باز می کند.
در مرحله بعد، هنگامی که می خواهید از pry برای اشکال زدایی استفاده کنید، باید به “pry” نیاز داشته باشید و یک binding.pry را در فایل خود وارد کنید مانند این:
# preparation.rb
require "pry"
a = [1, 2, 3]
a << 4
binding.pry # execution will pause here, allowing you to inspect all objects
puts a
این بدان معنی است که وقتی برنامه شما به جایی می رسد که binding.pry اعلام شده است ، به جای رفتن به خط بعدی کد، یک سشن جدید باز می کند.
این به شما این فرصت را می دهد که با متغیرها و اشیاء خود بازی کنید تا ببینید چرا همه چیز کار نمی کند.
این یک تکنیک اشکال زدایی بسیار قدرتمند است زیرا به شما امکان می دهد پروسه ی ران شدن را متوقف کنید تا وضعیت همه متغیرها و اشیاء در آن خط کد را بررسی کنید.
بعد از اینکه بررسی متغیرهای خود را تمام کردید، می توانید اجرای برنامه را با Ctrl + D ادامه دهید.
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
شکست شما از زماني شروع مي شود که تصوير کنيد ، همه چيز را مي دانيد