[#398788] Constructor or a Method — Rubyist Rohit <lists@...>

Take for instance this code:

13 messages 2012/09/01

[#398896] how to sum element of array — Edward QU <lists@...>

dear all

19 messages 2012/09/04

[#398936] best coding for limiting a value — Regis d'Aubarede <lists@...>

A) result=value<min ? min : (value > max ? max : value)

17 messages 2012/09/04

[#398962] Long calculation & time limit — toto tartemolle <lists@...>

Hello,

17 messages 2012/09/05

[#398964] Compiling ruby from source on windows — GPad <peterpan105105@...>

Hi to all,=0AI'm trying to compile ruby on my windows 7. I have already a r=

10 messages 2012/09/05

[#398997] OpenURI open method problem — "Derek T." <lists@...>

The code I am referring to looks like this:

12 messages 2012/09/05

[#399002] Parsing through downloaded html — Sybren Kooistra <lists@...>

Hi all,

28 messages 2012/09/06

[#399012] "Hiding" pictures(and source code if it's possible) — "Damián M. González" <lists@...>

Ey guys, how are you?

11 messages 2012/09/06

[#399083] regix in grep or something like this — Ferdous ara <lists@...>

Hi

12 messages 2012/09/07

[#399206] please help me with making script — Charmaine Willemsen <lists@...>

In this example i like to parse birthday and sexe

11 messages 2012/09/11

[#399218] Pathname#to_str withdrawn in 1.9? — matt@... (Matt Neuburg)

Just getting started experimenting with Ruby 1.9 (1.9.3) and my scripts

13 messages 2012/09/12

[#399227] Breaking Down the Block — incag neato <lists@...>

Can someone please explain in plain english how this block treats the

20 messages 2012/09/13

[#399244] ruby Range to array that acts like time objects? — "Jermaine O." <lists@...>

Hello everybody,

15 messages 2012/09/13

[#399293] Ruby on Ubuntu 12.04 LST — Bojan Jordanovski <lists@...>

Hello everybody,

13 messages 2012/09/14

[#399298] wow, YAML / Psych in 1.9.3 is *slow*! — matt@... (Matt Neuburg)

I just started trying Ruby 1.9.3, coming from Ruby 1.8.7, and was

12 messages 2012/09/14

[#399304] Ruby 1.9.3 and OS X Mountain Lion — sto.mar@...

Hi all,

16 messages 2012/09/14

[#399343] Class variables or Class singleton variables? — "Damián M. González" <lists@...>

Guys, how are you?

18 messages 2012/09/15

[#399386] Ruby - is it worth the effort? — neomex <neomex@...>

Hello,

19 messages 2012/09/17
[#399406] Re: Ruby - is it worth the effort? — Roger Pack <lists@...> 2012/09/17

Unfortunately with Ruby for me it's typically "fun and fast development"

[#399409] Re: Ruby - is it worth the effort? — Peter Zotov <whitequark@...> 2012/09/17

Roger Pack писал 17.09.2012 22:06:

[#399491] Re: Ruby - is it worth the effort? — Robert Klemme <shortcutter@...> 2012/09/19

On Mon, Sep 17, 2012 at 8:20 PM, Peter Zotov <whitequark@whitequark.org> wr=

[#399421] Encoding question — Thomas Bednarz <lists@...>

I am new to ruby and play around with it a little bit at the moment. I

17 messages 2012/09/17

[#399441] Bug or feature — Damjan Rems <lists@...>

There has probably been some discussion about this problem so sorry if I

13 messages 2012/09/18

[#399451] Class variables — Aleksander Ciesielski <neomex@...>

Is it obligatory to use instance variables in classes? Can't we just

17 messages 2012/09/18

[#399479] Ruby SQL Select Sum 2 Columns? — Courtney Fay <lists@...>

I have the following definition which is looking at an apache database,

12 messages 2012/09/18

[#399556] still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...>

Hi,

28 messages 2012/09/20
[#399570] Re: still learning by doing - connecting rooms in a game — Henry Maddocks <hmaddocks@...> 2012/09/20

[#399574] Re: still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...> 2012/09/21

Henry Maddocks wrote in post #1076876:

[#399575] Re: still learning by doing - connecting rooms in a game — Henry Maddocks <hmaddocks@...> 2012/09/21

[#399576] Re: still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...> 2012/09/21

Could you be so kind as to suggest another book? I mean there are many

[#399585] Re: still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...> 2012/09/21

Sebastjan H. wrote in post #1076909:

[#399572] How would you allow variable from specific list of Fixnum? — Eliezer Croitoru <eliezer@...>

I have:

11 messages 2012/09/21

[#399623] Very important question - survey — Marc Heiler <lists@...>

Is matz more like a ninja or more like a samurai?

11 messages 2012/09/22

[#399695] inject problem — Roelof Wobben <rwobben@...>

26 messages 2012/09/25

[#399714] could initialize return an existing object instead of a new instance? — Gary Weaver <lists@...>

Is it possible for initialize to return an existing object instead of a

9 messages 2012/09/25

[#399811] Good book for getting started with Ruby? [I code Python!] — Alec Taylor <alec.taylor6@...>

I've learned programming in C++, Python and PHP at University. (also

12 messages 2012/09/28

[#399815] calcaulation with unknown numbers of numbers and options fail — Roelof Wobben <rwobben@...>

11 messages 2012/09/28

Re: sandwhich principle (ruby koans)

From: Carlos Agarie <carlos.agarie@...>
Date: 2012-09-24 07:38:32 UTC
List: ruby-talk #399647
Roelof,

This principle says that when you have two pieces of code that are almost
identical, except for the "middle" part, you can create a method that takes
a block to fill the "middle" part.

For example, suppose you have two methods, and both need to save
information to a log file before and after execution:

def hello
  save_in_logfile "Starting to execute method 'hello'"
  puts "first method"
  save_in_logfile "Finishing execution of method 'hello'"
end

def world
  save_in_logfile "Starting to execute method 'world'"
  puts "second method"
  save_in_logfile "Finishing execution of method 'world'"
end

The "sandwich" the koan talks about could be interpreted as the
save_in_logfile methods being the slices of bread and the puts calls the
meat. So we could use blocks to create this:

def sandwich(string)
  save_in_logfile "Starting to execute method '#{string}'"
  yield
  save_in_logfile "Finishing to execute method '#{string}'"
end

And the two methods would become:

def hello
  sandwich("hello") do
    puts "first method"
  end
end

def world
  sandwich("world") do
    puts "second method"
  end
end

This way, the repetitive part (save_in_logfile stuff) is called in only one
place. This technique is used in the File::open method - when you call it
with a block, the opened file is automatically closed after the block is
executed.

Hope that helps!

2012/9/24 Roelof Wobben <rwobben@hotmail.com>

>  hello,
>
> I'm working on ruby koans.
>
> Now I have to do some sandwhich code.
>
> The exercise looks like this :
>
> require File.expand_path(File.dirname(__FILE__) + '/edgecase')
> class AboutSandwichCode < EdgeCase::Koan
>   def count_lines(file_name)
>     file =3D open(file_name)
>     count =3D 0
>     while line =3D file.gets
>       count +=3D 1
>     end
>     count
>   ensure
>     file.close if file
>   end
>   def test_counting_lines
>     assert_equal 4, count_lines("example_file.txt")
>   end
>   # ------------------------------------------------------------------
>   def find_line(file_name)
>     file =3D open(file_name)
>     while line =3D file.gets
>       return line if line.match(/e/)
>     end
>   ensure
>     file.close if file
>   end
>   def test_finding_lines
>     assert_equal "test\n", find_line("example_file.txt")
>   end
>   # ------------------------------------------------------------------
>   # THINK ABOUT IT:
>   #
>   # The count_lines and find_line are similar, and yet different.
>   # They both follow the pattern of "sandwich code".
>   #
>   # Sandwich code is code that comes in three parts: (1) the top slice
>   # of bread, (2) the meat, and (3) the bottom slice of bread.  The
>   # bread part of the sandwich almost always goes together, but
>   # the meat part changes all the time.
>   #
>   # Because the changing part of the sandwich code is in the middle,
>   # abstracting the top and bottom bread slices to a library can be
>   # difficult in many languages.
>   #
>   # (Aside for C++ programmers: The idiom of capturing allocated
>   # pointers in a smart pointer constructor is an attempt to deal with
>   # the problem of sandwich code for resource allocation.)
>   #
>   # Consider the following code:
>   #
>   def file_sandwich(file_name)
>     file =3D open(file_name)
>     yield(file)
>   ensure
>     file.close if file
>   end
>   # Now we write:
>   def count_lines2(file_name)
>     file_sandwich(file_name) do |file|
>       count =3D 0
>       while line =3D file.gets
>         count +=3D 1
>       end
>       count
>     end
>   end
>   def test_counting_lines2
>     assert_equal 4, count_lines2("example_file.txt")
>   end
>   # ------------------------------------------------------------------
>   def find_line2(file_name)
>     # Rewrite find_line using the file_sandwich library function.
>   end
>   def test_finding_lines2
>     assert_equal __, find_line2("example_file.txt")
>   end
>   # ------------------------------------------------------------------
>   def count_lines3(file_name)
>     open(file_name) do |file|
>       count =3D 0
>       while line =3D file.gets
>         count +=3D 1
>       end
>       count
>     end
>   end
>   def test_open_handles_the_file_sandwich_when_given_a_block
>     assert_equal __, count_lines3("example_file.txt")
>   end
> end
>
> But I don't get the principle.
> Can anyone explain this to me ?
>
> Roelof
>
>
>



--=20
Carlos Agarie
Control engineering student
Polytechnic School
University of S=E3o Paulo

In This Thread