The beauty of Ruby through examples

Discussion in 'Ruby' started by Adriano Ferreira, Sep 29, 2010.

  1. [Note: parts of this message were removed to make it a legal post.]

    Hey all,

    I'm about to introduce Ruby to a group of people that is not familiar to the
    language, and the approach i'd like to take is simply by distilling out a few
    sample codes. I've been collecting some from around the internet, but i'd
    appreciate your suggestions as well.

    I'm looking for code snippets that represent some of the beauty of Ruby
    actually, such as:

    # Simplicity
    # Expressiveness
    # Productivity
    # Flexibility
    # Dynamism
    # Freedom
    # Happiness

    Just to clear things up, here are few examples:

    # Simplicity

    vowels = %w(a e i o u)
    alfabet = ('a'..'z').to_a
    cons = alfabet - vowels
    p cons

    # Expressiveness

    hello = 'Hello Ruby'
    5.times { puts hello }

    # Productivity

    class Person
    # def name
    # @name
    # end
    #
    # def name=(other)
    # @name = other
    # end
    #
    # def age
    # @age
    # end
    #
    # def age=(other)
    # @age = other
    # end

    attr_accessor :name, :age
    end

    john = Person.new
    john.name = 'John'
    john.age = 25
    p john

    # Flexibility

    class Array
    def pick
    self[rand(self.size)]
    end

    alias :choose :pick
    end

    puts %w(1 2 3 4 5).pick
    puts %w(1 2 3 4 5).choose

    # Dynamism

    Padawan = Class.new

    class Jedi
    def train(padawan)
    def padawan.control_the_force
    puts "Now i'm ready to become a Jedi!"
    end
    end
    end

    skywalker = Padawan.new
    yoda = Jedi.new
    p skywalker.respond_to? :control_the_force # => false

    yoda.train skywalker
    p skywalker.respond_to? :control_the_force # => true
    skywalker.control_the_force# => Now i'm ready to become a Jedi!


    ...and so on.

    Any more examples?

    Thanks in advance,

    Adriano
     
    Adriano Ferreira, Sep 29, 2010
    #1
    1. Advertising

  2. I take it rand() gets pseudorandom numbers from computer and as such
    could be improved in one respect at least if ruby can be made to sleep
    or wait for random numbers of milliseconds. One complication with
    random number generation is that two numbers can come off the belt in
    the same millisecond. However making ruby wait a random number of
    milliseconds between each sample draw sample draw is the random numbers
    to provide the user would solve that problem. I just found the Pickaxe
    book the other day and am reading through it and learning. The thing I
    don't know is how much solving this problem with pseudorandom numbers
    would improve quality of samples.


    -----Original Message-----
    From: Adriano Ferreira [mailto:]=20
    Sent: Wednesday, September 29, 2010 14:41
    To: ruby-talk ML
    Subject: The beauty of Ruby through examples

    Hey all,

    I'm about to introduce Ruby to a group of people that is not familiar to
    the=20
    language, and the approach i'd like to take is simply by distilling out
    a few=20
    sample codes. I've been collecting some from around the internet, but
    i'd=20
    appreciate your suggestions as well.

    I'm looking for code snippets that represent some of the beauty of Ruby=20
    actually, such as:

    # Simplicity
    # Expressiveness
    # Productivity
    # Flexibility
    # Dynamism
    # Freedom
    # Happiness

    Just to clear things up, here are few examples:

    # Simplicity

    vowels =3D %w(a e i o u)
    alfabet =3D ('a'..'z').to_a
    cons =3D alfabet - vowels
    p cons

    # Expressiveness

    hello =3D 'Hello Ruby'
    5.times { puts hello }

    # Productivity

    class Person
    # def name
    # @name
    # end
    #=20
    # def name=3D(other)
    # @name =3D other
    # end
    #=20
    # def age
    # @age
    # end
    #=20
    # def age=3D(other)
    # @age =3D other
    # end
    =20
    attr_accessor :name, :age
    end

    john =3D Person.new
    john.name =3D 'John'
    john.age =3D 25
    p john

    # Flexibility

    class Array
    def pick
    self[rand(self.size)]
    end
    =20
    alias :choose :pick
    end

    puts %w(1 2 3 4 5).pick
    puts %w(1 2 3 4 5).choose

    # Dynamism

    Padawan =3D Class.new

    class Jedi
    def train(padawan)
    def padawan.control_the_force
    puts "Now i'm ready to become a Jedi!"
    end
    end
    end

    skywalker =3D Padawan.new
    yoda =3D Jedi.new
    p skywalker.respond_to? :control_the_force # =3D> false

    yoda.train skywalker
    p skywalker.respond_to? :control_the_force # =3D> true
    skywalker.control_the_force# =3D> Now i'm ready to become a Jedi!


    ...and so on.

    Any more examples?

    Thanks in advance,

    Adriano


    =20
     
    DaShiell, Jude T. CIV NAVAIR 1490, 1, 26, Sep 29, 2010
    #2
    1. Advertising

  3. Adriano Ferreira wrote:
    > Any more examples?


    For wow factor, I think you can't beat a 4-line webserver written in
    Sinatra.

    require 'sinatra'
    get '/' do
    'Hello, world!'
    end
    --
    Posted via http://www.ruby-forum.com/.
     
    Brian Candler, Sep 29, 2010
    #3
  4. Adriano Ferreira

    F. Senault Guest

    Le 29 septembre 2010 à 20:40, Adriano Ferreira a écrit :

    Hi.

    > I'm about to introduce Ruby to a group of people that is not familiar to the
    > language, and the approach i'd like to take is simply by distilling out a few
    > sample codes. I've been collecting some from around the internet, but i'd
    > appreciate your suggestions as well.


    In a presentation I made sometime ago, I used these at the beginning :

    File.open("script.rb") do |fichier|
    fichier.each do |ligne|
    if ligne.downcase.include? "ruby"
    puts ligne
    end
    end
    end

    File.open("script.rb") do |f|
    f.each { |l| puts l if l=~/ruby/i }
    end

    # The Lottery here is 7 out of 36 balls.
    (1..36).sort_by { rand }.slice(0,7).join(', ')

    fct1 = lambda { |v| v.split(/ /).
    collect { |z| z.capitalize }.join(' ') }
    fct2 = lambda { |v| v.split(//).
    collect { |c| c.ord }.join(',') }

    fct1.call("this is a nice string.")
    fct2.call("this is another nice string.")

    require "open-uri"
    open('http://www.google.com/') { |f| puts f.read }

    HTH,

    Fred
    --
    She rules until the end of time
    She gives and she takes
    She rules until the end of time
    She goes her own way (Within Temptation, Mother Earth)
     
    F. Senault, Sep 29, 2010
    #4
  5. On Sep 29, 2010, at 9:07 PM, Brian Candler wrote:

    > For wow factor, I think you can't beat a 4-line webserver written in=20=


    > Sinatra.


    What about a one-line HTTP server written in Lua? :p

    HTTP[ '/' ] =3D function() return 'Hello world' end TCPServer( =
    '127.0.0.1', 1080 )( HTTP )
     
    Petite Abeille, Sep 29, 2010
    #5
  6. F. Senault wrote:
    > File.open("script.rb") do |fichier|
    > fichier.each do |ligne|
    > if ligne.downcase.include? "ruby"
    > puts ligne
    > end
    > end
    > end
    >
    > File.open("script.rb") do |f|
    > f.each { |l| puts l if l=~/ruby/i }
    > end


    It's worth mentioning this, too:

    puts `grep -i ruby script.rb`
     
    Joel VanderWerf, Sep 29, 2010
    #6
  7. I guess you should show irb explicitly.

    Another thing worth pointing out: the Ruby source tarball is about 1/3
    of the size of Perl, but you get a whole load more libraries by default:
    openssl, https, md5/sha1 digests, readline, tk, dbm, ...
    --
    Posted via http://www.ruby-forum.com/.
     
    Brian Candler, Sep 29, 2010
    #7
  8. Adriano Ferreira

    botp Guest

    On Thu, Sep 30, 2010 at 3:30 AM, Petite Abeille
    <> wrote:
    > What about a one-line HTTP server written in Lua? :p
    >
    > HTTP[ '/' ] = function() return 'Hello world' end TCPServer( '127.0.0.1', 1080 )( HTTP )
    >


    yes, it's a one-liner, but, you'll have to _read_ it many times..
    cheers -botp
     
    botp, Sep 30, 2010
    #8
  9. Adriano Ferreira

    F. Senault Guest

    Le 29 septembre à 21:50, Joel VanderWerf a écrit :

    > F. Senault wrote:
    >> File.open("script.rb") do |fichier|
    >> fichier.each do |ligne|
    >> if ligne.downcase.include? "ruby"
    >> puts ligne
    >> end
    >> end
    >> end
    >>
    >> File.open("script.rb") do |f|
    >> f.each { |l| puts l if l=~/ruby/i }
    >> end

    >
    > It's worth mentioning this, too:
    >
    > puts `grep -i ruby script.rb`


    Yep, nice addition !

    Fred
    --
    I don't know who you are, But you seem very nice
    So will you talk to me?
    Shall I tell you a story, Shall I tell you a dream?
    They think I'm crazy. (K's Choice, Everything for free)
     
    F. Senault, Sep 30, 2010
    #9
  10. Adriano Ferreira

    F. Senault Guest

    Le 29 septembre à 21:26, F. Senault a écrit :

    And I forgot a simple, classic, one :

    def factorial(n)
    (1..n).inject(1) { |p, f| p * f }
    end

    def factorial(n)
    (1..n).inject(1, :*)
    end

    (I don't like much the second one, it's a bit less legible.)

    Fred
    --
    When my body starts to shiver from the chill of The scarlett sweat
    When my lips eclipse the sun and the moon Reflecting from the wet When
    the blood of my love outraces Every one of the stallions in your pack -
    that's when U go, u go, u go 2 the max (Prince, The Max)
     
    F. Senault, Sep 30, 2010
    #10
  11. Adriano Ferreira

    Robert Dober Guest

    On Thu, Sep 30, 2010 at 9:35 AM, F. Senault <> wrote:
    > Le 29 septembre =E0 21:26, F. Senault a =E9crit :
    >
    > And I forgot a simple, classic, one :
    >
    > def factorial(n)
    > =A0(1..n).inject(1) { |p, f| p * f }
    > end
    >
    > def factorial(n)
    > =A0(1..n).inject(1, :*)
    > end
    >
    > (I don't like much the second one, it's a bit less legible.)

    You see, that depends, it is more readanble to me. Probably totally
    depends on the context.
    For folks coming from functional languages the simple fact of using
    inject's synonym might also add to readability

    (1..n).reduce 1, :*

    In conclusion I prefer naming things, but the downside is that one has
    to communicate names and agree about them. The explicit code block
    does not have that disadvantage. However it does not trigger the
    information in the brain as quickly as names do, once they are
    understood.
    This might indeed be one of the forces and beauties of Ruby and it
    might be a good idea for OP to show that to his audience.

    Cheers
    Robert


    --=20
    The best way to predict the future is to invent it.
    -- Alan Kay
     
    Robert Dober, Sep 30, 2010
    #11
  12. Adriano Ferreira

    botp Guest

    On Thu, Sep 30, 2010 at 3:35 PM, F. Senault <> wrote:
    > def factorial(n)
    > =A0(1..n).inject(1, :*)
    > end
    > (I don't like much the second one, it's a bit less legible.)


    lose the 1.
    on my case, i do like the second very much. more idiomatic. less prone
    to typo. less to think (convention ie).

    i am referring of course, not to the factorial, but of the idiom,

    enum.inject :eek:perator
    enum.inject factor, :eek:perator

    eg,

    multiplying

    >> (1..5).inject :*

    =3D> 120
    >> (2..5).inject :*

    =3D> 120
    >> (3..5).inject :*

    =3D> 60

    adding

    >> (4..5).inject( :+ )

    =3D> 9

    multiply w factor

    >> (3..5).inject 5, :*

    =3D> 300

    adding w initial,

    >> (4..5).inject( 100, :+ )

    =3D> 109

    powers,

    >> (2..3).inject :**

    =3D> 8

    >> (2..4).inject :**

    =3D> 4096

    and more fun using blocks..

    best regards -botp
     
    botp, Sep 30, 2010
    #12
  13. On 30 September 2010 10:32, botp <> wrote:
    > On Thu, Sep 30, 2010 at 3:35 PM, F. Senault <> wrote:
    >> def factorial(n)
    >> =A0(1..n).inject(1, :*)
    >> end
    >> (I don't like much the second one, it's a bit less legible.)

    >
    > lose the 1.
    >
    > -botp


    Except if you want factorial of 0 to be right.

    While showing a cool example, I would go to:

    class Integer
    def !
    (1..self).inject 1, :*
    end
    end

    0.! # =3D> 1
     
    Benoit Daloze, Sep 30, 2010
    #13
  14. Adriano Ferreira

    botp Guest

    On Thu, Sep 30, 2010 at 4:58 PM, Benoit Daloze <> wrote:
    > Except if you want factorial of 0 to be right.


    my bad. i must review my math now :)
    best regards -botp
     
    botp, Sep 30, 2010
    #14
  15. Threading is light in ruby, so here a try show works in paralleles :

    require 'thread'
    require 'socket'
    require 'timeout'

    ############### Send a file by socket to www server

    def send_file(hostname,filename)
    timeout(3+File.size(filename)/10000) { # timeout, in seconds
    socket=TCPSocket.open(hostname,80)
    socket.write( "POST /upload/#{filename} HTTP/1.1\r\n\r\nContent=" )
    socket.write( IO.read(filename) )
    print "\n#{filename} transfered"
    }
    rescue Exception => ex
    puts "ERROR on transfert #{filename} to {hostname} : #{ex}"
    ensure
    socket.close rescue nil # anyway, try to close
    end

    ################### MAIN : send *.rb in //

    threads= Dir["*.rb"].map do |file|
    sleep(0.1) while Thread.list.size>20
    Thread.new { send_file(ARGV[0],file) }
    end
    threads.each {|thread| thread.join} # wait all finish before exit

    Attachments:
    http://www.ruby-forum.com/attachment/5114/beauty.rb

    --
    Posted via http://www.ruby-forum.com/.
     
    Regis d'Aubarede, Sep 30, 2010
    #15
  16. def printTree(tree,indent)
    if (Array === tree)
    tree.map { |child| printTree(child,indent+"| ") }
    else
    puts(indent.gsub(/\s+$/,"--")+tree.to_s)
    end
    end
    printTree([1,2,[11,22,[111,222,333,444],33],3,4],"")


    this give :
    |--1
    |--2
    | |--11
    | |--22
    | | |--111
    | | |--222
    | | |--333
    | | |--444
    | |--33
    |--3
    |--4
    --
    Posted via http://www.ruby-forum.com/.
     
    Regis d'Aubarede, Sep 30, 2010
    #16
  17. On 09/30/2010 07:48 AM, Regis d'Aubarede wrote:
    > def printTree(tree,indent)
    > if (Array === tree)
    > tree.map { |child| printTree(child,indent+"| ") }
    > else
    > puts(indent.gsub(/\s+$/,"--")+tree.to_s)
    > end
    > end
    > printTree([1,2,[11,22,[111,222,333,444],33],3,4],"")


    IMO this is more idiomatic:

    class Object
    def recursive_print indent = ""
    puts indent.gsub(/\s+$/,"--") + to_s
    end
    end

    module Enumerable
    def recursive_print indent = ""
    map { |child| child.recursive_print indent+"| " }
    end
    end

    [1,2,[11,22,[111,222,333,444],33],3,4].recursive_print
     
    Joel VanderWerf, Oct 1, 2010
    #17
  18. Adriano Ferreira

    John Sikora Guest

    How about some more simple ones like

    'Do Re Mi Fa So La Ti ' * 3

    [125, 450, 250, 1000, 675].sort.reverse.collect{|e| "$#{e}"}.take(3)

    ' hello there '.strip.center(30, '-')
    --
    Posted via http://www.ruby-forum.com/.
     
    John Sikora, Oct 1, 2010
    #18
  19. > # Dynamism
    >
    > Padawan =3D Class.new
    >
    > class Jedi
    > =A0def train(padawan)
    > =A0 =A0def padawan.control_the_force
    > =A0 =A0 =A0puts "Now i'm ready to become a Jedi!"
    > =A0 =A0end
    > =A0end
    > end
    >
    > skywalker =3D Padawan.new
    > yoda =3D Jedi.new
    > p skywalker.respond_to? :control_the_force =A0# =3D> false
    >
    > yoda.train skywalker
    > p skywalker.respond_to? :control_the_force =A0# =3D> true
    > skywalker.control_the_force# =3D> Now i'm ready to become a Jedi!



    Wow, these are fantastic, especially this last one. I don't know if
    this syntax (def padawan.control_the_force) has always been available
    but I have long been doing that in a much more complicated way.

    Please post your full list or your slides when you are finished! So
    often people ask me "what's so great about Ruby" and I can't put it
    into just a few sentences!
     
    Leslie Viljoen, Oct 1, 2010
    #19
  20. Adriano Ferreira

    w_a_x_man Guest

    On Oct 1, 12:14 am, John Sikora <> wrote:
    > How about some more simple ones like
    >
    > 'Do Re Mi Fa So La Ti ' * 3
    >
    > [125, 450, 250, 1000, 675].sort.reverse.collect{|e| "$#{e}"}.take(3)
    >
    > '      hello there  '.strip.center(30, '-')
    > --
    > Posted viahttp://www.ruby-forum.com/.


    [125, 450, 250, 1000, 675].sort.reverse.map{|e| "$#{e}"}[0,3]
    ==>["$1000", "$675", "$450"]
     
    w_a_x_man, Oct 2, 2010
    #20
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Frank
    Replies:
    1
    Views:
    394
    Aleksander Straczek
    Nov 22, 2004
  2. Sharp Tool

    Solve this beauty

    Sharp Tool, Oct 27, 2005, in forum: Java
    Replies:
    19
    Views:
    614
    Roedy Green
    Oct 28, 2005
  3. Roedy Green

    The beauty of TCP/IP

    Roedy Green, Dec 23, 2005, in forum: Java
    Replies:
    36
    Views:
    1,235
  4. Replies:
    1
    Views:
    1,703
    Paul McGuire
    Sep 19, 2006
  5. Replies:
    0
    Views:
    315
Loading...

Share This Page