String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
Убедитесь, что вы понимаете, почему. Это потому, что сравнение ==
сравнивает только ссылки; equals()
метод сопоставляет содержимое по символу.
Когда вы вызываете new для a
и b
, каждый получает новую ссылку, указывающую на "foo"
в таблице строк. Ссылки разные, но контент один и тот же.
Все (кроме false
и nil
) оценивается как true
в логическом контексте.
Это отличается от других языков, где пустые конструкции или 0
часто оцениваются как ложные
.
if 0
puts "0 evaluates to true"
end
Если вы действительно умеете программировать, вы уже знаете самые важные вещи о языке программирования Ruby. Просто следуй за ними.
Остальное находится в стопке руководств ; читать их.
Ruby использует передачу сообщений, а не вызовы функций.
например,
# These are all the same:
5 + 3
5.+(3)
5.send(:+, 3)
никто бы никогда не услышал об этом, если бы не Rails?
.ruby-debug - ваш друг. Я, наверное, использую его больше, чем любой другой драгоценный камень. Учитывая динамическую природу Ruby, трудно точно узнать, что делает конкретный фрагмент кода, глядя на текст в вашем редакторе. Просто поставьте перед ним «отладчик» и войдите в него.
это также отличный способ узнать, откуда берется динамически сгенерированный метод.
Вы не можете перегрузить operator =
так же, как вы сделали на C ++. Вы также не можете смоделировать это каким-либо разумным способом.
Стоит прочитать полностью: -
Топ 5 новых функций в Ruby 1.9
4. Лямбда-оператор
5.RubyGems и Rake объединены с Ruby
irb, pp, lp и ap - очень полезные волшебные слова! ;)
return
, где вы хотите быть более откровенным. для
циклов. символов
вместо строк, потому что они эффективны, например в хэш-ключах и т. д.
Я думаю, что люди охватили здесь большую часть основ. Вот некоторые дополнительные сведения:
унаследовано
, включено
, class_eval
, instance_eval
и:
@a = "something"
class << @a
def moo
puts "moo"
end
end
@a.moo
@b = "something else"
@b.moo
eval
- зло. Никогда не используйте его, если вы действительно, действительно , действительно не знаете, что делаете.
Методы неявно возвращают результат последнего оператора.
def foo
"bar"
end
puts foo # outputs "bar"
Если вызывается метод, о котором Ruby не знает, Ruby вызовет method_missing с подробностями.
class MyClass
def method_missing(method_name, *args)
puts "Method #{method_name} called with arguments #{args.join(', ')}"
end
end
my_instance = MyClass.new
my_instance.undefined_method(4, :blah) # => Method undefined_method called with arguments 4, blah
v 1.9 очень сильно отличается от v 1.8. Код, созданный для 1.8, НЕ гарантированно будет работать в 1.9, и наоборот.
У меня была целая куча кода, который работал в v 1.8 и не работал в v 1.9, а затем пришлось иметь дело с двумя машинами, на каждой из которых были разные версии. Невесело.
Убедитесь, что выбрали версию (возможно, самую последнюю, но имейте в виду, что многие примеры кода в блогах в Интернете имеют версию 1.87, как и второе издание книги "Программирование Ruby". С тех пор было выпущено третье издание Programming Ruby, которое охватывает 1.9, и это то, что вам нужно.
Также, если вы похожи на меня, вы будете напевать одну из трех песен во время программирования:
Практически все является выражением, возвращающим значение. Сюда входят вещи, которые вы обычно не воспринимаете как выражения, например определения классов - определение класса оценивается по последнему выражению внутри него. Аналогичным образом, if
и case
- это выражения, которые дают тот же результат, что и последнее выражение в какой-либо ветви.
Именно то, что они оценивают, хотя не всегда сразу очевидно: def
оценивается как ноль, но define_method
оценивается как Proc, представляющий метод, который он определил. Это в сочетании с тем фактом, что определение класса является выражением, иногда удивляет людей:
class A
define_method(:foo) {"hello"}
end
# => #<Proc:0x0001d718@(irb):18> # NOT nil
class A
define_method(:bar) {"hello"}
FAVORITE_NUMBER = 80
end
# => 80
Не злоупотребляйте патчем обезьяны. Руби облегчает это, но может навредить.
См. Также Обезьяна-патч против. ТВЕРДЫЙ. принципы?
Стойка. Все современные веб-серверы и фреймворки Ruby используют протокол Rack. Хотя вы можете создать веб-приложение на Ruby, не зная Rack, оно даст вам хорошую основу и приобретает все большее значение в веб-сообществе Ruby.
Rack также может стать хорошей отправной точкой для обучения программированию веб-приложений на Ruby, поскольку вы можете начать с самого простого веб-приложения:
run lambda { |env| [200, {}, "hello world"] }
и продолжать строить оттуда. После того, как вы разберетесь в Rack, архитектурные решения в Sinatra, Rails и т. Д. Станут более понятными.