Има ли примитивни типове в Ruby?

Аз съм разработчик на Java, който тепърва започва да изучава Ruby. Ruby има ли примитивни типове? Не мога да намеря списък с тях. Ако не, защо?


person emily    schedule 13.09.2013    source източник
comment
Знам, че това не отговаря на въпроса ви, но ако не сте запознати с Ruby, има страхотен урок за Codecademy на (www.codecademy.com/tracks/ruby). Надяваме се, че като преминете през уроците, можете да си спестите много време за отстраняване на неизправности по пътя!   -  person jwarner112    schedule 13.09.2013


Отговори (4)


Основен принцип на Ruby е, че всички данни трябва да бъдат представени като обекти. Други езици като Smalltalk следват подобна парадигма.

Предимството на този дизайн е, че прави Ruby по-елегантен и по-лесен за научаване. Правилата, приложими към обектите, се прилагат последователно към целия Ruby.

Например, когато начинаещите за първи път учат Java, разликата между примитивния тип int и обвиващия клас Integer може да бъде объркваща. Това объркване се изостря от понякога объркващите имплицитни преобразувания между двете чрез автобоксиране.

Така че защо езици като Java или C# ще се занимават с примитивни типове? Отговорът е изпълнение. Създаването на обекти води до допълнителни разходи в сравнение с примитивите.

person dbyrne    schedule 13.09.2013
comment
О, БОЖЕ МОЙ! за 1 минута или по-малко сте написали тези много редове... :) - person Arup Rakshit; 13.09.2013
comment
Дори това, което другите езици смятат за примитиви, са обекти в Ruby. Например: 5.object_id е различно от 5902123.object_id. Това са два различни обекта Fixnum. - person tadman; 13.09.2013
comment
@VirtualDXS Не съм сигурен какъв Ruby използвате, но на моя той връща същата стойност последователно. - person tadman; 25.09.2016
comment
@tadman Прав си; бъркам се Низовете се държат така, така че предположих, че fixnums също ще се държат така. - person Dessa Simpson; 25.09.2016
comment
Низовете го правят, затова Ruby има конструкцията Symbol вместо това. Сравняването на еквивалентността е лесно, ако object_id съвпада. Ако не, сравняването на низове отнема много повече време. - person tadman; 25.09.2016

В Ruby няма примитивни типове данни. Всяка стойност е обект, дори литералите се превръщат в обекти:

    nil.class  #=> NilClass
   true.class  #=> TrueClass
  'foo'.class  #=> String
   :bar.class  #=> Symbol
    100.class  #=> Integer
   0x1a.class  #=> Integer
0b11010.class  #=> Integer
  123.4.class  #=> Float
1.234e2.class  #=> Float

Това ви позволява да пишете красив код като:

3.times do
  puts "Hello from Ruby"
end
person Stefan    schedule 13.09.2013

Цитирам от Относно Ruby

В Ruby всичко е обект. Всеки бит информация и код могат да получат свои собствени свойства и действия.

В много езици числата и други примитивни типове не са обекти. Ruby следва влиянието на езика Smalltalk, като предоставя методи и променливи на екземпляри на всички негови типове. Това улеснява използването на Ruby, тъй като правилата, приложими към обектите, се прилагат към целия Ruby.

Java избира да запази някои примитивни типове главно за производителност, но трябва да признаете, че не всеки тип е клас понякога прави Java кода малко неудобен. Философията на Ruby е да улесни дните на програмиста, мисля, че превръщането на всичко в обект е един от начините да се постигне това.

person Yu Hao    schedule 13.09.2013
comment
=> обект ли е? Странно, че в Ruby мога да направя 1.method(:+).class и да получа Method, но {}.method(:=>).class е синтактична грешка. Почти сякаш... не всичко е Обекти? - person Ziggy; 13.06.2014
comment
Е, => не е метод на Hash. Но {}.method(:[]).class връща Method, както бихте очаквали. Така че не, не всичко в Ruby е обект, ако включите във всичко странни части от синтаксис, интервали, запазени думи и т.н. -- това е малко очакване. - person zetetic; 07.01.2015

В ruby ​​няма примитивни типове данни. Тъй като ruby ​​е чисто обектно-ориентиран език. По принцип има типове данни като други езици, но тези типове данни са класове като колекции в java.

Ако дефинирате произволна стойност на низ като Akshay, тогава тя е обект. Можете да проверите изображението по-долу, в което Akshay има object_id 30300. Моля, щракнете върху връзката, за да проверите обектите на конзолата на релсите. От още примери от изображението можем да решим, че всичко е обект в ruby, с изключение на ключовите думи.

Така че тук можем да заключим, че Ruby преобразува тези примитивни типове данни в класове.

Конзолата на Ruby с примитивни данни като обект

person Akshay Kakade    schedule 12.02.2021