محدوده متغیر

متغیرها در Ruby دارای محدوده هستند. محدوده یک متغیر به شما می‌گوید که در کجای برنامه می‌توان از متغیر استفاده کرد و یا متغیر قابل دسترسی است. به عنوان مثال متغیری که در داخل یک متد تعریف می‌شود فقط در داخل بدنه متد قابل دسترسی است. می‌توان دو متغیر با نام یکسان در دو متد مختلف تعریف کرد. برنامه زیر این ادعا را اثبات می‌کند :

 1: def firstLocalVariable
 2:   number = 10
 3:   puts number
 4: end
 5: 
 6: def secondLocalVariable
 7:   number = 20
 8:   puts number
 9: end
10: 
11: firstLocalVariable()
12: 
13: secondLocalVariable()
10
20

مشاهده می‌کنید که حتی اگر ما دو متغیر با نام یکسان تعریف کنیم (خطوط 2 و 7) که دارای محدوده‌های متفاوتی هستند، می‌توان به هر کدام از آنها مقادیر مختلفی اختصاص داد. متغیر تعریف شده در داخل متد ()firstLocalVariable هیچ ارتباطی به متغیر داخل متد ()secondLocalVariable ندارد. وقتی به مبحث کلاسها رسیدیم در این باره بیشتر توضیح خواهیم داد. Ruby دارای چهار محدوده است:

  • متغیرهای محلی (Local variable)
  • متغیرهای سراسری (Global variable)
  • متغیرهای نمونه (Instance variable)
  • متغیرهای کلاس (Class variable)

متغیرهای محلی (Local variable)

متغیرهایی که داخل متدها تعریف می‌شوند محلی هستند و فقط داخل همان متد قابل استفاده‌اند. به مثال زیر توجه کنید:

 1: def LocalVariable
 2:   number = 10
 3:   puts number
 4: end
 5: 
 6: LocalVariable()
 7: 
 8: puts number
10
undefined local variable or method `number' for main:Object (NameError)

همانطور که مشاهده می‌کنید با فراخوانی متد در خط 6 مقدار متغیر number چاپ می‌شود ولی در خط 8 که سعی در چاپ مقدار این متغیر داریم با پیغام خطا مواجه می‌شویم چون طول عمر این متغیر تا زمانی است که متد به پایان نرسیده است. با پایان متد متغیر و مقدار آن هم از بین می‌رود در نتیجه در خارج از متد نمی‌توان مقدار آن را چاپ کرد.

متغیرهای سراسری (Global variable)

متغیرهایی که در بیرون متد تعریف می‌شوند و نام آنها با علامت $ شروع می شود، از نوع سراسری هستند. به مثال زیر توجه کنید:

 1: $firstNumber  = 10
 2: $secondNumber = 5
 3: $sum
 4: 
 5: def globalVariable
 6:   $sum = $firstNumber + $secondNumber
 7:   puts $sum
 8: end
 9: 
10: globalVariable()
11: puts $sum
15
15

متغیرهای firstNumber$ و secondNember$ و sum$ در بیرون متد تعریف شده‌اند و از نوع سراسری هستند، در داخل متد اگر بخواهیم به آنها دسترسی پیدا کنیم باید قبل از نام آنها از علامت $ استفاده نماییم. در مورد متغیرهای نمونه و کلاس در آینده توضیح می دهیم.