Впечатляющий пример Ruby - PullRequest
7 голосов
/ 17 ноября 2009

через несколько дней я выступаю с докладом о проекте Rails в университете и хочу познакомить аудиторию с Ruby.

Я хочу показать им один или два действительно хороших примера кода, чтобы продемонстрировать, какой классный Ruby.

Вы знаете хороший пример?

С наилучшими пожеланиями

Ответы [ 10 ]

6 голосов
/ 17 ноября 2009

Покажите им, как вы преобразуете 50 уродливых строк грязного кода в 3 простых и понятных кода. (Первая строка комментария)

Не показывай, как ты крут с рубином. Но как они будут крутыми, если будут использовать ruby:)

5 голосов
/ 17 ноября 2009

Я бы очень рекомендовал что-то с .each, .inject и / или .collect. Например:

# Sum 1,3,5,7,9,11,13
[1,3,5,7,11,13].inject { |a,b| a+b }

или

# Print out all of the files in a directory
Dir.glob('./my_cool_directory/*').each do |file|
  puts file
end

или

# Find the length of all of the strings
["test", "hello there", "how's life today?"].collect{ |string| string.length }
4 голосов
/ 17 ноября 2009

Я впечатлен тем, что можно сделать с помощью твита. Отслеживать актуальные темы так просто.

установить с:

gem sources -a http://gems.github.com
gem install intridea-tweetstream

Вот демонстрационный код:

#!/usr/local/bin/ruby 

if ARGV.size==1
  keyword = ARGV.shift
else
  puts 'tweetmon usage: tweetmon <keyword>'
  exit 1
end

require 'yaml'
require 'rubygems'
require 'tweetstream'

config = YAML::load(File.open(File.expand_path('~/.twitter')))
user =config['username']
password =config['password']

TweetStream::Client.new(user,password).track(keyword) do |status|  
  puts "[#{status.created_at}-#{status.user.screen_name}] #{status.text}"
end  

Вам необходимо создать файл с именем .twitter в корневой директории пользователя в форме:

username: my-twitter-username
password: my-twitter-password

Обратите внимание, что ruby ​​читает эту конфигурацию всего за 4 строки (включая yaml require.)

Вы запускаете это так:

ruby tweetmon.rb keyword-to-be-monitored

(Помните, что вам нужно экранировать # в mac / linux, например: tweetmon.rb \#devdays)

Из такого простого фрагмента вы можете делать такие вещи, как подсчет, сколько раз каждый человек вносит свой вклад, захватывать сегменты твита в файл, ... все виды вещей с этой начальной точки ...

2 голосов
/ 17 ноября 2009

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

2 голосов
/ 17 ноября 2009
irb(main):007:0> 2**2048
=> 32317006071311007300714876688669951960444102669715484032130345427524655138867
89089319720141152291346368871796092189801949411955915049092109508815238644828312
06308773673009960917501977503896521067960576383840675682767922186426197561618380
94338476170470581645852036305042887575891541065808607552399123930385521914333389
66834242068497478656456949485617603532632205807780565933102619270846031415025859
28641771167259436037184618573575983511523016459044036976132332872312271256847108
20209725157101726931323469678542580656697935045997268352998638215525166389437335
543602135433229604645318478604952148193555853611059596230656

Попробуйте 2 ** 20000 или любое другое смешное большое число.

1 голос
/ 18 ноября 2009

Вот несколько классных рубиновых примеров, которые я собрал за эти годы:

1 голос
/ 17 ноября 2009

Мне нравится Ruby, потому что он часто позволяет мне делать то, что я хочу, вместо того, чтобы тратить много времени на «настройку» решения. Итак, несколько примеров:

Сумма неотрицательных чисел в массиве [-1, 3, -10, 0, 5, 8, 16, -3.14159]

[-1, 3, -10, 0, 5, 8, 16, -3.14159].select { |x| x > 0 }.inject { |acc, x| acc + x }

По сравнению с формой, общей для других языков:

sum = 0;
foreach (x in [-1, 3, -10, 0, 5, 8, 16, -3.14159]) {
  if(x > 0) sum += x;
}
return x;

Простая обработка исключений

x = method_that_might_raise_exception() rescue nil

По сравнению с:

try {
  x = method_that_might_raise_exception()
} catch (Exception) {
  x = nil
}

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

Открытые классы Ruby - интересная тема, хотя ими можно злоупотреблять:

class Array
  def sum_of_squares
    map { |x| x * x }.inject { |acc, x| acc + x }
  end
end

[1, 3, 5, 9].sum_of_squares

Существует также богатая тема метапрограммирования, но это может быть слишком много для введения в Ruby? Я надеюсь, что что-то здесь было полезно для вас, и я хотел бы поддержать мнение Графика.

1 голос
/ 17 ноября 2009

Вы должны полностью показать им массив Двемти, он просто так говорит о силе, которая лежит в метапрограммировании в Ruby.

Найдите это здесь!

0 голосов
/ 18 ноября 2009

Я бы показал, как просто создать хороший dsl-метод - в частности, method_missing действительно прост для понимания, но очень мощный и позволяет вам делать действительно классные вещи.

0 голосов
/ 17 ноября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...