From: Dan Zwell Date: 2007-05-08T12:12:47+09:00 Subject: Re: Difference answers from Terminal, TextMate, and BBEdit Greg wrote: > On 2007-05-07 18:16:38 -0700, Tim Hunter said: > >> Greg wrote: >>> A newbie here trying to develop one of Pine's tutorial scripts. Ruby >>> v1.8.6 >>> >>> I get different results from my script in Terminal, TextMate, and >>> BBEdit. How is this possible? >>> >>> TextMate seems to be the closest to what I'd expect. I'd buy it if >>> the undo's were better. Plus I already own BBEdit. I realize BBEdit >>> doesn't profess to support Ruby script running that much, but I >>> expected Terminal to be consistent. >>> >>> I've driven myself crazy trying to debug my script, stalled in >>> BBEdit, so went to Terminal, but after putting in all kinds of puts >>> to figure out what was going on, tried my demo TextMate and it ran >>> better. In all cases exactly the same file. >>> >>> Thanks for any clues. >>> >>> >> It would help if you'd post your script, what answers you expected, >> and what answers you got. > > Thanks for answering. Here it goes: > > #!/usr/bin/env ruby > > class OrangeTree > > MSG_GROW = "Type \"year\" to grow your tree." > MSG_PICK = "Type a number to pick some more fruit. " > EXIT_TXT = "Something went wrong." > > def initialize # we have one tree, does it need a name? > @heightInches = 0 # at year zero > @age = 0 > @fruit = 0 # inches, work out feet and inches later > puts "Congratulations, you planted an orange tree. In a few years it > will start bearing fruit. #{@age} " # Age only for debugging. Can take > it out. > puts MSG_GROW > end > > def ageOneYear > @heightInches = @heightInches +1 > puts 'Height: ' + @height.to_s > @age += 1 > # @age = @age + 1 > puts "Got to ageOneYear. Age: #{@age}" > case( @age ) > when (1..3) : puts("Your #{@age} year old tree is too > young to bear fruit yet. #{MSG_GROW}" ) > when (4..29) : puts(" Age: #{@age}. Place holder until > get 1..3 working." ) > when (30) : puts("Your tree was very fruitful, but > it reached old age and died.") > else puts( " Something went wrong. #{EXIT_TXT}" ) > end > end # def ageOneYear > > def height > # returns the height end > > def pick_an_orange > puts 'Got to pick_an_orange, but haven\'t defined yet' > # reduce this year count by one > end > > end # class OrangeTree > > # here we go countLoop = 0 > tree = OrangeTree.new # assume we need to initialize it. Does it need a > name? > > while countLoop < 100 > countLoop += 1 > puts "countLoop = #{countLoop}" # debugging. > if gets.to_s=='year' puts 'In the gets.to_s if clause' # > debugging. tree.ageOneYear > end > > gets case when 'year' : tree.ageOneYear # , y as shortcut? > when (1..100) : tree.pick_an_orange > else puts('Don\'t be greedy, don\'t try to pick more than 100 > oranges') > end > > end # while > > TextMate response. I answered 'year' to each request for input: > RubyMate r6354 running Ruby r1.8.6 (/usr/local/bin/ruby) >>>> OrangeTree.post.rb > > Congratulations, you planted an orange tree. In a few years it will > start bearing fruit. 0 Type "year" to grow your tree. > countLoop = 1 > Height: Got to ageOneYear. Age: 1 > Your 1 year old tree is too young to bear fruit yet. Type "year" to grow > your tree. > countLoop = 2 > Height: Got to ageOneYear. Age: 2 > Your 2 year old tree is too young to bear fruit yet. Type "year" to grow > your tree. > countLoop = 3 > Height: Got to ageOneYear. Age: 3 > Your 3 year old tree is too young to bear fruit yet. Type "year" to grow > your tree. > countLoop = 4 > Height: Got to ageOneYear. Age: 4 > Age: 4. Place holder until get 1..3 working. > NoMethodError: undefined method `+' for nil:NilClass > method gets > in stdin_dialog.rb at line 6 > method gets > in stdin_dialog.rb at line 13 > at top level > in OrangeTree.post.rb at line 58 > ==END TextMate response > > Terminal response. All 'year' are my responses. I stopped after two none > reponses. > new-host-2:~ xxxxxx$ ruby -v > ruby 1.8.6 (2007-03-13 patchlevel 0) [powerpc-darwin8.9.0] > new-host-2:~ xxxxxx$ ruby "/Volumes/share/Greg/Ruby++/OrangeTree.post.rb" > Congratulations, you planted an orange tree. In a few years it will > start bearing fruit. 0 Type "year" to grow your tree. > countLoop = 1 > year > Height: Got to ageOneYear. Age: 1 > Your 1 year old tree is too young to bear fruit yet. Type "year" to grow > your tree. > year > year > ===End Terminal > > BBEdit output. I only Cmd-R to run the script. I was never asked for input. > > Congratulations, you planted an orange tree. In a few years it will > start bearing fruit. 0 Type "year" to grow your tree. > countLoop = 1 > Height: Got to ageOneYear. Age: 1 > Your 1 year old tree is too young to bear fruit yet. Type "year" to grow > your tree. > countLoop = 2 > Height: Got to ageOneYear. Age: 2 > Your 2 year old tree is too young to bear fruit yet. Type "year" to grow > your tree. > countLoop = 3 > Height: Got to ageOneYear. Age: 3 > Your 3 year old tree is too young to bear fruit yet. Type "year" to grow > your tree. > countLoop = 4 > Height: Got to ageOneYear. Age: 4 > Age: 4. Place holder until get 1..3 working. > countLoop = 5 > Height: Got to ageOneYear. Age: 5 > Age: 5. Place holder until get 1..3 working. > > countLoop = 100 > Height: Got to ageOneYear. Age: 100 > Something went wrong. Something went wrong. > ===END BBEdit > > TextMate was close, but I expected values for @heightInches to increase > with each iteration. > > I would like it to work in BBEdit, but realize BareBones support for > this is weak. But at least Terminal should get it right. I own BBEdit, > so am reluctant to buy TextMate, particularly since it has significant > features I would like missing. > > Thanks for any help. > > I hope this isn't a double posting. My original was via Usenet, then I > found the Google Groups and tried to post there, but I am not sure I am > a member there. This version may be somewhat different as I had to > recreate it after realizing Google Groups wasn't working for me. > > > Greg, I saw two clear mistakes. First, you didn't end height(). Second, your later "case" statement should be: case gets.chomp because gets() usually includes a newline. Perhaps that is the root of your problem--different methods of input may or may not have a newline at the end. calling chomp() removes any present newlines at the end. (I also removed the "if gets.to_s=='year'" line because it didn't seem helpful.) I didn't test it that much after seeing those, but I hope this helps. Good luck, Dan