فهم أنواع البيانات في روبي

المقدمة

عند كتابة البرامج، تستخدم أنواع البيانات لتصنيف البيانات. تخبر أنواع البيانات الكمبيوتر كيفية التعامل مع البيانات في برنامجك. كما أنها تحدد ما يمكنك فعله بالبيانات، بما في ذلك العمليات التي يمكنك القيام بها.

طريقة واحدة للتفكير في أنواع البيانات هي النظر إلى الأنواع المختلفة من البيانات التي نستخدمها في العالم الحقيقي. على سبيل المثال، نستخدم الأعداد الصحيحة (0، 1، 2، …)، والأعداد الصحيحة (، -1، 0، 1، …)، والأعداد اللا منطقية (π).

عادةً ما نستطيع في الرياضيات دمج الأرقام من أنواع مختلفة، والحصول على نوع من الإجابة. على سبيل المثال، قد نريد إضافة 5 إلى π:

5 + π

يمكننا إما الاحتفاظ بالمعادلة كالجواب لتأخذ في الاعتبار العدد اللا منطقي، أو يمكننا تقريب π إلى عدد معين من الأماكن العشرية، ومن ثم إضافة الأرقام معًا:

5 + π = 5 + 3.14 = 8.14

ولكن إذا حاولنا تقييم الأرقام بنوع بيانات آخر، مثل الكلمات، ستبدأ الأمور في أخذ منحى غير منطقي. كيف سنحل المعادلة التالية؟

sky + 8

هذا ليس شيئًا نعرفه على الفور كيفية حله. الكمبيوتر لا يستطيع ذلك أيضًا لأن البيانات هي من نوعين مختلفين. “السماء” هي كلمة، و 8 هو عدد صحيح. عندما نكتب البرامج، يجب أن نكون حذرين في كيفية تعيين القيم وكيفية التلاعب بها من خلال عمليات مثل الجمع، والطرح، والضرب، وغيرها.

في هذا البرنامج التعليمي، ستتعلم عن أهم أنواع البيانات الأصلية في روبي: الأعداد الصحيحة، الأعداد العشرية، السلاسل النصية، الرموز، المصفوفات، والهاشات. لا يعد هذا تحقيقًا شاملاً لأنواع البيانات، ولكنه سيساعدك في التعرف على الخيارات المتاحة لك في برامجك.

ستقوم بعد ذلك باستكشاف الكتابة الديناميكية. تحدد برامج روبي أنواع البيانات استنادًا إلى ما تحتويه المتغيرات، لذا فهم كيفية عمل الكتابة الديناميكية سيساعدك في تجنب المواقف الصعبة في برامجك الخاصة. ونظرًا لأن المتغيرات يمكن أن تحتوي على أي قيمة، ستتعلم كيفية تحديد نوع بيانات المتغير.

لنبدأ بالنظر في كيفية العمل مع الأعداد الصحيحة في روبي.

الأعداد الصحيحة

كما هو الحال في الرياضيات، الأعداد الصحيحة في برمجة الكمبيوتر هي أعداد صحيحة يمكن أن تكون إيجابية، سلبية، أو صفر (…, -1, 0, 1, …). ويعرف العدد الصحيح أيضًا باسم int.

يمكنك طباعة العدد الصحيح بهذه الطريقة:

print -25
Output
-25

يمكنك أيضًا تخزين العدد الصحيح في متغير ثم طباعة القيمة عن طريق الإشارة إلى المتغير:

my_int = -25
print my_int
Output
-25

يمكنك أيضًا إجراء عمليات حسابية باستخدام الأعداد الصحيحة. على سبيل المثال، يمكنك حساب مجموع رقمين وطباعة النتيجة:

sum = 116 - 68
print sum
Output
48

عندما نكتب الأرقام الكبيرة، نميل إلى استخدام الفواصل لجعلها أكثر قراءة. على سبيل المثال، سنكتب 1,000,000 لتمثيل “مليون واحد”. لا يمكنك استخدام الفواصل في الشيفرة الخاصة بك، ولكن يتيح لك Ruby استخدام علامة التحتسطير (_) لجعل الأرقام الكبيرة أكثر قراءة.

جرب ذلك:

large_number.rb
large_number = 1_234_567
print large_number

سترى العدد الصحيح مطبوعًا بدون خطوط تحتسطير:

Output
1234567

تتيح لك الخطوط تحتسطير كتابة شيفرة أكثر قراءة إذا كنت تحتاج إلى تمثيل أرقام كبيرة في برامجك.

مع تعلمك المزيد حول لغة Ruby، ستكون لديك العديد من الفرص للعمل مع الأعداد الصحيحة. دعونا نلقي نظرة على كيفية العمل مع الأعداد الحقيقية.

الأعداد العائمة

A floating-point number or a float represents a real number. Real numbers can be either a rational or an irrational number; numbers that contain a fractional part, such as 9.0 or -116.42. In other words, a float in a Ruby program is a number that contains a decimal point.

يمكنك طباعة الأعداد العائمة في Ruby تمامًا كما تفعل مع الأعداد الصحيحة:

print 17.3
Output
17.3

يمكنك أيضًا إعلان متغير وتعيين قيمة عائمة له:

my_float = 17.3
print my_float
Output
17.3

و، تمامًا كما هو الحال مع الأعداد الصحيحة، يمكنك القيام بعمليات رياضية مع الأعداد العائمة في Ruby أيضًا:

sum = 564.0 + 365.24
print sum
Output
929.24

إذا قمت بإضافة عدد عائم إلى عدد صحيح في Ruby، ستحصل على عدد عائم:

sum = 564 + 365.24
print sum
Output
929.24

ستعتبر Ruby أي رقم يكتب بدون عشريات على أنه عدد صحيح (مثل 138)، وأي رقم يكتب مع عشريات على أنه عدد عائم (مثل 138.0).

الآن، دعونا نلقي نظرة على القيم المنطقية في Ruby.

أنواع بيانات بوليانية

البوليانات تُستخدم لتمثيل القيم الصحيحة المرتبطة بفروع المنطق في الرياضيات، التي تُعلم خوارزميات علوم الحاسوب. في روبي، نُمثل هذا النوع من البيانات بإحدى القيمتين، إما true أو false.

العديد من العمليات في الرياضيات تُعطينا إجابات تقيّم إما إلى صحيحة أو خاطئة:

  • أكبر من
  • 500 > 100 true
  • 1 > 5 false
  • أقل من
  • 200 < 400 true
  • 4 < 2 false
  • متساوي
  • 5 = 5 true
  • 500 = 400 false

مثل الأرقام، يمكنك تخزين قيمة true أو false في متغير:

result = 5 > 8

بعد ذلك يمكنك طباعة القيمة البوليانية باستدعاء دالة print():

print result

بما أن 5 ليست أكبر من 8 سترى النتيجة التالية:

Output
false

كلما كتبت برامج أكثر في روبي، ستصبح أكثر تمرّسًا في كيفية عمل البوليانات وكيف يمكن أن تغيّر الدوال والعمليات المختلفة التي تقيّم إما إلى true أو false مسار البرنامج.

الآن، دعنا نستكشف العمل مع النص في برامجنا.

سلاسل

A string is a sequence of one or more characters, such as letters, numbers, and symbols. Strings primarily exist within either single quotes (') or double quotes (") in Ruby, so to create a string, enclose a sequence of characters in quotes, like this:

"This is a string in double quotes."

البرنامج الصغير “مرحبًا، عالم!” يوضح كيف يمكن استخدام سلسلة في برمجة الكمبيوتر، حيث تشكل الأحرف التي تتكون منها عبارة مرحبًا، عالم! سلسلة.

print "Hello, World!"

كما هو الحال مع أنواع البيانات الأخرى، يمكنك تخزين السلاسل في متغيرات:

output = "Hello, World!"

وطباعة السلسلة عن طريق استدعاء المتغير:

print output
Output
Hello, World!

مثل الأرقام، هناك العديد من العمليات التي يمكننا إجراؤها على السلاسل داخل برامجنا لتلاعب بها لتحقيق النتائج التي نسعى إليها. السلاسل مهمة لنقل المعلومات إلى المستخدم، وللمستخدم لنقل المعلومات إلى البرنامج.

في بعض الأحيان تحتاج إلى العمل مع قوائم من البيانات. هنا تكون المصفوفات مفيدة.

المصفوفات

يمكن لـ المصفوفة أن تحمل قيمًا متعددة داخل متغير واحد. وهذا يعني أنه يمكنك تضمين قائمة من القيم داخل مصفوفة والتكرار من خلالها. يُطلق على كل عنصر أو قيمة داخل مصفوفة عنصر.

تعرف المصفوفات بتحديد القيم بين قوسين مربعين [ ]، مفصولة بفواصل.

مصفوفة الأعداد تبدو كما يلي:

[-3, -2, -1, 0, 1, 2, 3]

A array of floats looks like this:

[3.14, 9.23, 111.11, 312.12, 1.05]

إليك قائمة من السلاسل:

['shark', 'cuttlefish', 'squid', 'mantis shrimp']

مثل غيرها من أنواع البيانات، يمكنك تعيين مصفوفة لمتغير:

sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']

إذا قمنا بطباعة المتغير، سيكون الإخراج مطابقًا تمامًا للمصفوفة التي أنشأناها:

print sea_creatures
['shark', 'cuttlefish', 'squid', 'mantis shrimp']

يمكنك الوصول إلى عناصر المصفوفة الفردية باستخدام رقم فهرس، بدءًا من 0.

puts sea_creatures[0] # سمكة قرش
puts sea_creatures[2] # حبار

لطباعة القيمة الأخيرة، يمكنك استخدام الفهرس -1. توفر Ruby أيضًا الأساليب .first و .last لالتقاط الإدخال الأول والأخير، على التوالي:

puts sea_creatures.first # سمكة قرش
puts sea_creatures.last # جمبري قرناء

تستطيع مصفوفات في Ruby أن تحتوي على العديد من أنواع البيانات المختلفة. يمكنك تخزين سلاسل النصوص، والرموز، وحتى مصفوفات أخرى داخل مصفوفة:

record = [
:en,
"Sammy",
42,
[
"coral",
"reef"
]
]

مصفوفات في Ruby هي قابلة للتغيير، وهذا يعني أنه يمكنك إضافة قيم، وإزالة قيم، وحتى تعديل الإدخالات في المصفوفة.

أحيانًا نحتاج إلى طريقة لوصف الأشياء في البرنامج. هذا ما تستخدم له الرموز.

الرموز

A symbol is a special data type that acts like a label or an identifier in a Ruby program. Symbols are immutable, which means that they cannot be changed. A symbol looks like a variable declaration without a value. Here’s an example of a symbol:

:time_zone

في Ruby ، تستخدم عادة رمزًا لتحديد شيء مهم ، بينما تستخدم سلسلة نصية للعمل معها أو تلاعبها. كل سلسلة في برنامج Ruby هي كائن مستقل ، بموقع فريد خاص به في الذاكرة ، حتى لو كانت السلاسل متطابقة.

ولكن إذا كنت تشير إلى نفس الرمز عدة مرات ، فإنك تشير إلى نفس الكائن في كل مكان في برنامجك ، مما يعني أنك تشير إلى نفس موقع الذاكرة.

سترى هذا المفهوم في العمل عندما ننظر إلى الهاشات ، التي تتيح لك ربط المفاتيح بالقيم.

الهاشات

A hash is a dictionary-like collection of keys and values. These key-value pairs provide a useful way to store and access data. Hashes are often used to hold data that are related, such as the information about a user. You define a hash like this:

{"first_name" => "Sammy", "last_name" => "Shark"}

يمكنك تعيين الهاشات للمتغيرات تمامًا مثل أنواع البيانات الأخرى:

user = {"first_name" => "Sammy", "last_name" => "Shark"}

لاسترداد القيم من هاش المستخدم ، يمكنك استخدام المفتاح للقيمة:

print user["first_name"] # "Sammy"
print user["last_name"] # "Shark"

يمكنك استخدام الرموز كمفاتيح في هاشك بدلاً من السلاسل النصية:

user = {:first_name => "Sammy", :last_name => "Shark"}

يُفضل استخدام الرموز كمفاتيح هاش عندما يكون ذلك ممكنًا. كل حالة من الرمز تشير إلى نفس الكائن ، بينما تشير كل حالة من السلسلة إلى كائن فريد. استخدام الرموز كمفاتيح يؤدي إلى أداء أفضل قليلاً واستخدام أقل للذاكرة.

عند استخدام الرموز كمفاتيح ، تستخدم الرموز لاسترداد القيم:

print user[:first_name] # "Sammy"
print user[:last_name] # "Shark"

يمكنك أيضًا استخدام بنية تركيب قليلاً مختلفة عند تحديد الهاش:

user = {first_name: "Sammy", last_name: "Shark"}

تتشابه هذه الصيغة مع الصيغة المستخدمة في جافا سكريبت ولغات أخرى. تحدد هذه الصيغة المفاتيح كرموز، لذا ستصل إلى الإدخالات باستخدام :first_name و :last_name بدلاً من السلاسل "first_name" و "last_name".

لقد نظرت إلى عدة أنواع من البيانات، لذا دعنا نلقي نظرة على كيفية عمل روبي مع تلك الأنواع.

التطبيق الدينامي

في روبي، لا تعلن بشكل صريح نوع بيانات قبل تعيين قيمة. تعيين القيمة يحدد نوع البيانات. تستخدم روبي التطبيق الدينامي، مما يعني أن فحص النوع يتم في وقت التشغيل بدلاً من وقت التجميع، كما في اللغات التي تستخدم التطبيق الثابت. يحدد روبي نوع البيانات من البيانات المخزنة في المتغير. هذا مشابه لأنواع البيانات في بايثون ول أنواع البيانات في جافا سكريبت.

المتغير t في المثال التالي يمكن أن يتم تعيينه إلى أي نوع بيانات متاح:

t = 42 # t is an Integer
t = "Sammy" # t is a String
t = :sammy # t is a Symbol
t = true # t is a boolean (true)
t # t is nil

مع لغات البرمجة ذات النوع الدينامي، يمكنك إعادة استخدام متغير موجود لاحتواء أنواع بيانات مختلفة.

هذا مفيد عند تحويل البيانات من نوع إلى آخر. على سبيل المثال، قد يحتوي الكود على هذا الشكل الذي يطلب من المستخدم قيمة عددية:

print "Please enter the length of the room: "
length = gets.chop

البيانات التي تحصل عليها من لوحة المفاتيح دائمًا سلسلة نصية، لذا من أجل إجراء العمليات الرياضية، عليك تحويل بيانات المتغير length إلى عدد. في اللغات المكتوبة بنظام النوع الثابت، حيث يجب عليك تعريف نوع بيانات المتغير قبل أن تتمكن من تعيين قيمة له، ستحتاج إلى متغير جديد لاحتواء البيانات المحولة. ولكن في Ruby، بما أنها تعتمد على النوع الديناميكي، يمكنك إعادة استخدام المتغير length إذا كنت ترغب في ذلك.

# قم بتحويل المبلغ إلى عدد عشري.
length = length.to_f

طريقة to_f تقوم بتحويل السلسلة إلى عدد عشري. توفر Ruby أيضًا طريقة to_i لتحويل السلاسل إلى أعداد صحيحة، ويمكن تحويل معظم الكائنات إلى سلاسل باستخدام الطريقة to_s:

42.to_s # "42"
(42.5).to_s # "42.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"

على الرغم من أن Ruby تعتمد على النوع الديناميكي، إلا أنها لا تسمح لك بأداء العمليات على أنواع مختلفة من البيانات دون تحويلها إلى نفس النوع. على سبيل المثال، سيؤدي هذا الكود إلى حدوث خطأ:

print 5 + "5"
Output
TypeError: String can't be coerced into Integer

كذلك هذا الكود:

print "5" + 5
Output
TypeError: no implicit conversion of Integer into String

إذا كنت ترغب في جمع الأرقام معًا للحصول على 10، قم بتحويل السلسلة إلى عدد صحيح. إذا كنت ترغب في دمجها معًا للحصول على "55"، قم بتحويل العدد إلى سلسلة.

النوع الديناميكي يوفر المرونة، ولكن أحد العيوب هو أنه لا يمكنك دائمًا أن تكون متأكدًا من نوع البيانات التي تعمل عليها، حيث يمكن أن يحتوي المتغير على أي نوع متاح. توفر Ruby طرقًا لتحديد نوع البيانات.

تحديد أنواع البيانات

في Ruby ، تكاد كل الأشياء تكون كائنات. العدد الصحيح، العدد العشري، المصفوفة، الرمز، والهاش كلها كائنات Ruby، ولديها جميعًا طريقة تسمى class التي ستخبرك بنوعها. حتى القيم البوليانية true و false ، والقيمة nil هي كائنات أيضًا. جرب بنفسك:

42.class # عدد صحيح
(42.2).class # عدد عشري
["Sammy", "Shark"].class # مصفوفة
true.class # TrueClass
nil.class # NilClass

بالإضافة إلى ذلك، يمكنك استخدام الطريقة kind_of? للتحقق من نوع معين من البيانات، مثل هذا:

42.kind_of?(Integer) # صحيح

هذا مفيد خاصة عندما يكون لديك متغير وترغب في تحديد نوعه:

# في أي مكان في الكود...
sharks = ["Hammerhead", "Tiger", "Great White"]
...
# في مكان آخر...

sharks.kind_of?(Hash) # خطأ
sharks.kind_of?(Array) # صحيح

يمكنك أيضًا استخدام هذا للتحقق من أن البيانات القادمة من مصدر خارجي صحيحة:

if data.kind_of? String
data = data.to_f
end

روبي توفر أيضًا الطريقة is_a?، التي تقوم بنفس الشيء الذي يقوم به kind_of? ولكن قد يكون أسهل قليلاً في القراءة بالنسبة لبعض المطورين:

if data.is_a? String
data = data.to_f
end

استخدام class، kind_of?، و is_a? يمكن أن يساعدك في التأكد من أنك تعمل مع نوع صحيح من البيانات. وكلما تعلمت المزيد عن روبي، ستكتشف وسائل أخرى للتعامل مع البيانات لا تتضمن التحقق صراحة من نوع البيانات.

استنتاج

ستستخدم العديد من أنواع البيانات المختلفة في برامجك بلغة روبي. الآن لديك فهم أفضل للأنواع الرئيسية المتاحة في برامج روبي.

تفضل بالنظر إلى هذه الدروس للاستمرار في استكشاف أنواع البيانات في روبي:

Source:
https://www.digitalocean.com/community/tutorials/understanding-data-types-in-ruby