2010-05-28 3 views
13

Я новичок в изучении языка, и мне нужно знать, что нужно делать, чтобы создать полноценный веб-сайт или веб-приложение с использованием языка программирования Ruby?Какие самые важные вещи знать о Ruby?

Главным образом Ruby on Rails with Rake и другие инструменты, которые в основном используют рейк.

Обновление: Я знаю много других языков, таких как C++, Java, PHP, Perl, и т.д., и т.д ....

Update 2: Это здорово ... держать их прибытием!

+3

Пятьдесят? Что это, заключительный вопрос Каллинга Стоуна? –

+0

Так что просто назовите это «важные вещи, чтобы знать» или что-то в этом роде. Какой смысл прогнозировать количество ответов, которые вы получаете в названии вашего вопроса, как будто это действительно имеет отношение к тому, что вы спрашиваете? –

+5

Сделано в Японии для смены! – Secko

ответ

12

Все (кроме false и nil) вычисляет true в логическом контексте.

Это отличное от других языков, где пустые конструкции или 0 часто оценивают как false.

if 0 
    puts "0 evaluates to true" 
end 
+1

Это упоминается в http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-be-warned- about –

-10

никто бы никогда не слышал об этом, если бы не Rails?

+6

Вы не смогли дать никакого представления о реальном вопросе ... хотя ваше утверждение, вероятно, верно. –

+0

Он использовался до рельсов, только не так много. – ryeguy

+0

Я экспериментировал с ним за несколько лет до появления Rails. –

10

Все - объект. Все.

+0

Есть ли способ сделать что-то не объектом? Как и в C/C++, вы можете делать объекты, но вам это не нужно. Я считаю, что Java одинаково ... у вас может быть только основная функция, которая выполняет всю работу ... но у вас, вероятно, будут какие-то объекты. PHP может иметь объекты, но он не требуется, и много раз объекты в PHP не используются. –

+0

Число 1984 - объект. Когда он все сказал? ... он имел в виду ** все **. – ANeves

+0

Даже класс любого объекта - это объект и класс класса .. .. и даже ноль - это объект .. и «true» и «false» тоже .. и класс (или объект) _method_ can быть объектом тоже .. –

1

IRB, с, штр & ап очень полезные волшебные слова! ;)

  1. http://github.com/oggy/looksee = LP
  2. http://github.com/michaeldv/awesome_print = ар
+0

Я не уверен, что эти ссылки имеют отношение ко всему. Можете ли вы рассказать о irb, pp, lp и ap? ... почему они волшебны? ... по крайней мере, просто краткое обсуждение. –

+0

Я слышал о irb, это очень приятная функция. pp кажется классным ... так что я вроде как метод ToString() Java, который можно перезаписать для объекта, чтобы вы могли распечатать красивый просмотр объекта, если хотите? –

+0

irb - это «интерактивная рубиновая» консоль, в которой вы можете сразу запустить свой код, а другие инструменты - отличные инструменты для проверки любых методов объекта/класса/модуля и/или наследования. отличная помощь при отладке или изучении некоторых новых API-интерфейсов –

5

Рубин использует передачу сообщений, а не вызовы функций.

например,

# These are all the same: 
5 + 3 
5.+(3) 
5.send(:+, 3) 
+0

Ничтожество, но не совсем, поскольку вы можете переопределить 'Fixnum # send', а третья строка может иметь другой эффект. –

+1

Многие, многие вещи о рубине могут быть ложными, если вы переопределяете основные методы, такие как 'send' –

+2

. Чтобы набросить больше, существует' __send__' для случаев, когда 'send' был переопределен. Бывает. Я бы сказал, что единственной причиной переопределения '__send__', однако, является злоба. – x1a4

7
  1. Вы можете использовать рубин модули в качестве Mixins, где ваш проект требует множественного наследования
  2. Каждого метод возвращает значение своего последнего утверждения в качестве значения методы, хотя вы можете использовать return, где вы хотите быть более явным.
  3. Вы можете снова открыть любой класс и добавить к нему методы, называемые патчами обезьян, которые могут быть очень мощными, если их использовать разумно, иначе ад сломается.
  4. Вы можете передать блок кода любому методу и работать с ним, например. в рубиновом мире большинство кодеров используют итераторы вместо for петель.
  5. По возможности используйте symbols вместо строк, потому что они эффективны, например. в хэш-ключей

и т.д ..

2

Если метод Руби не знает, что называется, Руби будет называть 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 
+0

Интересный ... это расширяемый? Является ли это глобальной функцией или чем-то, что вы можете выбрать для создания в классе/объекте, который вы создаете? –

+1

Да, классы могут переопределять 'method_missing' в соответствии с их потребностями. – mipadi

+0

Это одно из важных различий между отправкой сообщений и вызовами методов. Когда объект получает сообщение в Ruby, он будет выполнять * some * метод в ответ. Если есть метод, соответствующий методу, выбирается тот. В противном случае объект выполняет 'method_missing', что позволит ему отвечать на абсолютно произвольные методы. – Chuck

7

Строки изменяемые; Символов нет.

8

методы неявно возвращает результат последнего утверждения.

def foo 
    "bar" 
end 

puts foo # outputs "bar" 
+2

Как и блоки. Не забудьте выполнить отладку printf после последней строки (в прошлом), иначе вы будете возвращать другое значение! –

0

Вы не можете перегрузить operator= так же, как вы делали в C++. Вы также не можете имитировать его каким-либо образом, что имеет смысл.

+0

Вы можете сделать условие, которое задает класс. Что вы подразумеваете под вторым предложением? –

+0

@Andrew Я имею в виду все, что * выглядит *, как 'operator =' было перегружено. –

1

стоит полный доступ на чтение: -

Top 5 New Features in Ruby 1.9

  1. YARV - Еще один рубин В.М.
  2. Волокна
  3. Названный Regexp Группы

4.The Lambda Оператор

5.RubyGems и Rake объединены с Ruby

3

Почти все - это выражение, которое возвращает значение. Это включает в себя те вещи, которые вы обычно не считаете выражениями, такими как определения классов - определение класса оценивается с последним выражением внутри него. Аналогично, if и case являются выражениями, которые оценивают тот же результат, что и последнее выражение в той ветви, в которой была выбрана ветка.

Точно то, что они оценивают, если не всегда сразу же очевидно: def оценивает значение nil, но define_method оценивает Proc, представляющий метод, который он определил. Это в сочетании с тем, что определение класса является выражением иногда удивляет людей:

class A 
    define_method(:foo) {"hello"} 
end 

# => #<Proc:[email protected](irb):18> # NOT nil 

class A 
    define_method(:bar) {"hello"} 
    FAVORITE_NUMBER = 80 
end 

# => 80 
+2

Фактически, возвращаемое значение 'def' определяется реализацией, а не' nil'. Например, в Rubinius он возвращает объект 'CompiledMethod', соответствующий этому методу. –

+0

Хм, это немного удивительно. Я думал, что МРТ должна быть эталонной реализацией. Спасибо за информацию. – Chuck

+0

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

-2

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

Остальное находится в стопке руководств; читай их.

+1

Это отрицательный комментарий и не дает никакого представления о задаваемом вопросе. –

+0

Возможно, это может быть прочитано отрицательно, но то же самое можно сказать и о самых кратких сообщениях. Однако утверждение о том, как программировать, является правильным; и ОП требует достаточного лингвистического опыта, чтобы его не принимали оскорбительно;). – TerryP

1

ruby-debug - ваш друг. Я, вероятно, использую его больше, чем любой другой камень. Учитывая динамический характер Ruby, трудно точно узнать, что делает конкретный фрагмент кода, просматривая текст в вашем редакторе. Просто бросьте «отладчик» перед ним и входите в него.

Это также отличный способ узнать, откуда идет динамически генерируемый метод.

4

Rack. Все современные веб-серверы и фреймворки Ruby используют протокол Rack. Хотя вы можете сделать веб-приложение Ruby без знания Rack, это даст вам хорошую основу, и это становится все более важным в веб-сообществе Ruby.

Rack может также стать хорошей отправной точкой для обучения программы веб-приложений в Ruby, так как вы можете начать с самого простого веб-приложения:

run lambda { |env| [200, {}, "hello world"] } 

и вы можете продолжать строить оттуда. После того, как вы понимаете Rack, архитектурные решения в Sinatra, Rails и т. Д. Имеют больше смысла.

http://rack.rubyforge.org/

2

v 1.9 очень сильно отличается от v 1.8. Код, построенный для 1.8, равен NOT гарантированно работает в 1.9, и наоборот.

У меня была целая куча кода, которая работала в версии 1.8, а не в версии 1.9, а затем приходилось иметь дело с двумя машинами, каждая из которых имела разные версии. Не весело.

Обязательно выберите версию (возможно, последняя, ​​но будьте осторожны, что в блогах в Интернете содержится много примеров кода в блоге 1.87, как и второе издание Programming Ruby. С тех пор было выпущено a third edition of Programming Ruby, которое охватывает 1,9, и это тот, который вы хотите

Кроме того, если вы похожи на меня, вы будете петь одну из трех песен при программировании его:.

+0

Я обязательно буду петь Ruby Soho от Rancid теперь, когда вы упомянули об этом ... и я буду громко играть на своих динамиках! –

+0

Не так сложно писать код, который работает как на 1,8, так и на 1,9. –

+0

@ Andrew Grimm - это может быть, но 1.9 не обратно совместим с 1.8. Для меня, как только вы откажетесь от совместимости, это должно быть, по крайней мере, серьезным изменением версии, а не второстепенным. – mmr

0

Я думаю, что люди освещали большинство основ здесь. Вот некоторые передовые вещи:

inherited, included, class_eval, instance_eval и:

@a = "something" 
class << @a 
    def moo 
    puts "moo" 
    end 
end 
@a.moo 
@b = "something else" 
@b.moo 

eval зло. Никогда не используйте его, если вы действительно, действительно, действительно знаете, что вы делаете.

+0

Что делает пример кода с eval? Я смущен. –

+0

Это не так, просто упоминание о том, что вы не должны его использовать. –

Смежные вопросы