Това нарочно ли е?

  1. Умишлено е. Няма причина да е забранено. Още повече, можеш да го направиш в (почти) всеки динамично-типизиран език, за който се сетиш. Python, Perl, JavaScript, you name it.

    Интересно ми е, какъв проблем намираш с това? Очевидно кодът не е много полезен, но какво и защо трябва да прави Ruby, за да го предотврати?

  2. Под "умишлено" визирам да е изрично написана точно тази функционалност :)

    Интересно ми беше дали някой е имал достатъчно малко работа за да имплементира подобно нещо или просто е решил, че "чак толкова малоумни програмисти няма да има" и е пропуснал да сложи проверка ...

  3. Ето как се стига до това решение:

    Първият въпрос е дали това отдясно на class RandomSubclass < да бъде оценено (1) по време на компилация* или (2) по време на изпълнение.

    Повечето динамично-типизирани езици избират по време на изпълнение. Има няколко причини:

    • Single-pass compiler. Програмата може да се "компилира" само на едно изчитане на кода.
    • По-лесно. Ако искаш да го правиш по време на компилация, имаш нужда от по-сложен parser. Отделно, усложняваш сериозно семантиката на езика.
    • По-гъвкаво. Позволява ред метапрограмирания. Например, можеш да дефинираш един родител за Ruby 1.8 и друг за Ruby 1.9 (не че има смисъл от различни родители).
    • Няма реална причина да ограничаваш програмиста. Ruby (Perl, Python) се опитват леко да ти намекват когато едно нещо е по-добро от друго, но отвъд това не ти се пречкат. Позволяват ти да правиш колкото можеш повече неща. Отговорността си е твоя.

    След като се вземе такова решение, езика няма голям избор. Не можеш да анализираш израза и да кажеш, че е глупав избор за родител. Например, опитай да измислиш каква проверка могат да сложат авторите на Ruby.

    А дори да има нещо, винаги ще има начин да се заобиколи. Така че подобно ограничение няма смисъл.

Трябва да сте влезли в системата, за да може да отговаряте на теми.