سؤال

هل أنا مبتدئ أتعلم روبي، أم أن لديها بالفعل طرقًا لكتابة الأشياء (نفسها) أكثر من Java/C#؟أيضًا، إذا كانت أكثر مرونة من Java، فهل توجد أي ميزات لغوية لروبي بشكل عام لا تستخدم لتجنب الارتباك؟

قد تكون الأمثلة مهمة متوازية وجميع الطرق المختلفة لكتابة السلاسل، ربما؟

ملحوظة: أنا لا أطلب المقارنة مع Java/C#...فقط سؤال اللغة هذا من فضلك ...

يحرر: أدرك أن C# وJava وRuby مكتوبة بقوة، وأن Ruby فقط (مثل Python وغيرها) تتم كتابته ديناميكيًا (بينما تتم كتابة Java/C# بشكل ثابت).تقول بعض الإجابات أن اللغات المكتوبة ديناميكيًا أكثر مرونة.هل هذا صحيح بالضرورة، وكيف يؤثر على بناء الجملة؟ أنا أسأل فقط عن المرونة النحوية.

(يتم أيضًا كتابة PHP ديناميكيًا وهي تفعل ذلك لا يبدو أكثر مرونة من Java/C#، بقدر ما رأيت.مرة أخرى، أعني من حيث بناء الجملة، وليس من حيث النشر ولا أي جانب آخر ...)

هل كانت مفيدة؟

المحلول

لا أعرف Java أو C#، لكنني أسمح لحقيقة أنه يمكنك إعادة تعريف كيفية عمل + على الأرقام بالتحدث عن نفسها.

نصائح أخرى

بالنسبة لي، فإن الميزات الأكثر استخدامًا في روبي والمفقودة في Java هي كتل التعليمات البرمجية/lambdas/الإغلاقات.

هناك ميزة أخرى رائعة (ولكنها ربما خطيرة) وهي الفصول المفتوحة - حيث يمكنك تغيير أي فئة تريدها - إضافة طريقة جديدة، أو تغيير الطريقة القديمة، وما إلى ذلك.يمكنك حتى إضافة طريقة إلى كائن معين، وليس الفصل بأكمله :).

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

ومع ذلك، فمن المثير للسخرية إلى حد ما أنه حتى إصدار Python 3.0 (المعروف أيضًا باسم:3000) كانت قيم السلسلة واليونيكود من أنواع مختلفة.على الرغم من أنه يبدو منطقيًا، إلا أن الأشخاص يواجهون أحيانًا مشكلات حيث يقومون بالتحويل بين الاثنين كثيرًا لإجراء عمليات نصية.

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

ردًا على كتابة PHP ديناميكيًا:

يتميز نظام الكتابة في PHP بالمرونة، مما يسمح بتحويل الأنواع تلقائيًا بناءً على السياق الذي يتم استخدامها فيه.ومع ذلك، فإن هذا لا يشكل في الواقع أنواعًا ديناميكية حقيقية.اللغة نفسها ثابتة في الغالب ولن تسمح لك بإضافة سمات إلى الكائنات في وقت التشغيل، على سبيل المثال (على الأقل، في آخر مرة قمت فيها بالتحقق).

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

روبي هي لغة ديناميكية.C# وJava كلاهما لغة مكتوبة بشكل ثابت مع كتابة قوية.ستضيف لغة C# في الإصدار 4.0 ميزات ديناميكية، ولكن حتى الآن، كان لدى Java وC# نموذج مختلف تمامًا وأكثر صرامة من اللغات الديناميكية مثل Ruby وPython.

لقد علقت على إجابة rkj أعلاه فيما يتعلق بـ lambda.يوضح هذا الرمز المثال الذي طلبته؛

def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end

def fixed_point(x, point, process, test)
  return point if test.call(x, point)
  fixed_point(x, process.call(x, point), process, test)
end

def sqrt(n)
  process = lambda {|n,g| average g, (n/g) }
  test = lambda {|n,g| abs(square(g) - n) < 0.001} 
  fixed_point(n, 1.0, process, test)
end

النقطة الأولى التي يجب ملاحظتها هي أن fixed_point تتعامل الطريقة مع الفكرة العامة المتمثلة في تطبيق العملية تدريجيًا على بعض البيانات حتى تجتاز اختبارًا معينًا.ال sqrt تحدد الوظيفة عملية العثور على الجذر التربيعي واختبار تحديد متى سنكون راضين.يتم بعد ذلك تمرير هذه "الإجراءات" تمامًا مثل أي شكل آخر من أشكال البيانات fixed_point يمكن أن تعمل انها سحرية.

بدلاً من تخزين العملية مؤقتًا واختبارها، يمكن أن يكون الأمر برمته مجهولاً.يمكننا إعادة الكتابة sqrt مثل؛

def sqrt(n)
  fixed_point( n, 1.0, 
      lambda {|n,g| average g, (n/g)},
      lambda {|n,g| abs(square(g) - n) < 0.001} )
end

بدون هذه القدرة، سأضطر إلى تحديد كل من العملية والاختبار كوظائف فردية وإنشاء وظيفة خاصة sqrt_fixed_point وظيفة للاتصال بهم.بقدر ما أعلم، يمكن لـ Java القيام بشيء مماثل باستخدام Functors ولكني لا أعرف ما يكفي للتعليق.الإجماع الذي رأيته في المدونات أو ما شابه ذلك هو أن Java تجعل هذا الأمر معقدًا للغاية لدرجة أنك ستصاب بنزيف في الأنف بمجرد تجربتها.

بالطبع، هناك خيار آخر توفره روبي وهو البرمجة الفوقية.يمكنني إعادة الكتابة sqrt بحيث يعيد الكتابة (على الطاير) fixed_point باستخدام العملية والاختبار الصحيحين، ولكن من المحتمل أن يكون هذا إساءة استخدام للميزة :-)

ملاحظة.إن رابط JoelOnSoftware المنشور يستحق التكرار؛ http://www.joelonsoftware.com/items/2006/08/01.html

عادةً ما تكون جميع اللغات المكتوبة ديناميكيًا (مثل روبي) أكثر مرونة من اللغات المكتوبة بشكل ثابت (مثل Java).لا يتعين عليك القتال مع نظام الكتابة، والذي غالبًا ما ينتهي بك الأمر إلى القيام به باللغات المكتوبة بشكل ثابت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top