2016-01-24 3 views
0

RubyMonk делает вывод о том, как вы можете использовать символы подчеркивания для удобства записи больших чисел, которые могут быть трудночитаемыми без демаркации.Метод создания огромного количества

Их задача: попытаться использовать символы подчеркивания, чтобы сделать огромный, читаемый номер. Они предоставляют этот код:

def describe(something) 
    puts "I am a: #{something.class} and I look like: #{something}" 
end 

def big_num 
    # create a huge number 
end 

describe(big_num) 

Может ли кто-нибудь объяснить, как я собирался создать огромное количество? В соответствии с приведенными ниже сообщениями об ошибках, я должен использовать символы подчеркивания в коде, чтобы он прошел.

+0

'1000 == 1_000', поэтому' 1_000_000_000' .. Это обозначение подчеркивания Ruby позволяет нам использовать (для удобства). – Myst

+2

Какое сообщение об ошибке? – sawa

+1

Uh. 'Bignum' и' Fixnum' являются реалистично-ориентированными оптимизациями, их действительно не следует преподавать в рубиновом курсе вообще, особенно не для начинающих. Ruby только гарантирует, что существует класс Integer, и он позволяет, но не требует и не определяет один или несколько подклассов для конкретной реализации. –

ответ

2

RubyMonk ожидает объект класса Bignum, который является частью стандартной библиотеки Ruby. Из документации:

Объекты Bignum сохраняют целые числа вне диапазона Fixnum. Объекты Bignum создаются автоматически, когда вычисления целых чисел будут иначе переполнение a Fixnum.

Таким образом, вам просто нужно создать число, которое больше, чем может обрабатывать Fixnum. Например, это будет проходить спецификации RubyMonk в:

def big_num 
    5_000_000_000_000_000_000_000 
end 

Поскольку число больше, чем Fixnum может работать, Ruby автомагически возвращает Bignum вместо. Например, попробуйте запустить это:

5_000_000_000.class 
# => Fixnum 
5_000_000_000_000_000_000_000.class 
# => Bignum 
+0

Я попытался просто написать 1_000_000_000 внутри метода. RubyMonk возвращает эти ошибки 1) является Bignum 2) RSpec :: Expectations :: ExpectationNotMetError 3) ожидал, что 1000000000 будет своего рода Bignum - – beetlehope

+0

@newbie RubyMonk ожидает объект класса Bignum. Я объяснил, что происходит в моем отредактированном ответе. – brito

+0

Спасибо, теперь понятно! – beetlehope

1

Ruby позволяет вам помещать символы подчеркивания при написании литералов, чтобы большие числа можно было читать легче.

Конвенция гласит, что не следует ставить знак подчеркивания, если число имеет длину 4 или меньше цифр и каждые три числа, если это больше, начиная с правой:

10_000_000 # => 10000000 

Работы для чисел с плавающей тоже:

10_000.0 # => 10000.0 

подчеркивания игнорируются интерпретатором, если вы поместите их между двумя цифрами:

1_2_3_4_5 # => 12345 

После просмотра сообщения об ошибке ясно, что RubyMonk ожидает Bignum. Это еще одна магия, которую делает интерпретатор прозрачно - если число достаточно мал, чтобы быть сопоставлен с междунар разрядности архитектуры, номер экземпляра Fixnum:

100.class # => Fixnum 

Если это не так, Ruby автомагически использует выделенный класс (Bignum):

(10_000_000**100).class # => Bignum 
    # 10_000_000 to the power of 100, 
    # which is a very big number and 
    # thus stored in Bignum 
+0

Я попробовал просто написать 1_000_000_000 внутри метода. RubyMonk возвращает эти ошибки 1) является Bignum 2) RSpec :: Ожидания :: ExpectationNotMetError 3) ожидал, что 1000000000 будет своего рода Bignum – beetlehope

+0

@newbie, обновил мой ответ. – ndn

2

Рубин позволяет использовать подчеркивание в качестве заполнителей (т.е. они только увеличивают читаемость для человека и в других случаях игнорируются).Таким образом, ваш метод big_num может просто иметь одну строку:

return 1_000_000_000_000_000_000_000_000_000_000_000 

И призыв, который будет возвращать 1000000000000000000000000000000000

(return необязательное ключевое слово)

+2

Почему вы рекомендуете использовать опциональный 'return' здесь, зная (надеюсь), что это не условно? –

+0

OP кажется новым для Ruby, поэтому они могут или не могут знать, что Ruby вернет значение без явного 'return'. В том числе это делает ясно (er), что делает линия (особенно, если фон OP находится на требующих его языках), в скобках указывается, что это необязательно, поэтому, если они еще не знают, что они делают сейчас. См. Также http://stackoverflow.com/questions/1023146/is-it-good-style-to-explicitly-return-in-ruby для интересного обсуждения использования vs, не использующего его - независимо от соглашения. – Exupery