Does Ruby have a 'which' like method

Discussion in 'Ruby' started by Scott G Smith, Oct 7, 2009.

  1. Most UNIX shells have a which command.

    It tells me the file which corresponds to a shell command.

    Demo:
    which date
    /bin/date

    In ruby,
    Suppose I'm dealing with a String.

    This String has had some methods mixed-in.

    For example,

    s = 'hello'
    p(s.length)

    Is there a way I can find the module or string.rb which defined the
    length() method?

    I'd like it to work like this:

    p(s.which('length'))
    /my/rubyfiles/string_module.rb

    Thanks,
    Scott
    Scott G Smith, Oct 7, 2009
    #1
    1. Advertising

  2. Scott G Smith wrote:
    > Most UNIX shells have a which command.
    >
    > It tells me the file which corresponds to a shell command.
    >
    > Demo:
    > which date
    > /bin/date
    >
    > In ruby,
    > Suppose I'm dealing with a String.
    >
    > This String has had some methods mixed-in.
    >
    > For example,
    >
    > s = 'hello'
    > p(s.length)
    >
    > Is there a way I can find the module or string.rb which defined the
    > length() method?
    >
    > I'd like it to work like this:
    >
    > p(s.which('length'))
    > /my/rubyfiles/string_module.rb


    you should be able to do the same thing using: http://www.railsapi.com

    make sure to select 'Rails v2.3.4 or Rails v2.3.4 + Ruby v1.9' before clicking
    on the 'Browse Online' otherwise you will get Rails APIs by default

    >
    > Thanks,
    > Scott
    >
    >



    --
    Kind Regards,
    Rajinder Yadav

    http://DevMentor.org
    Do Good ~ Share Freely
    Rajinder Yadav, Oct 7, 2009
    #2
    1. Advertising

  3. Rajinder,
    your pointer to sdoc is a good one.
    Thanks!

    It turns out the answer to my question was actually answered by me
    when I was taking out the trash.

    The answer is: Just use the debugger.
    When I "step into" a method,
    the debugger gives me the file name of that method.

    I demonstrate with a screendump:

    Tue Oct 06 23:50 /software maco$
    Tue Oct 06 23:50 /software maco$ rails cars4sale
    create
    create app/controllers
    create app/helpers
    create app/models
    create app/views/layouts
    create config/environments
    create config/initializers
    create config/locales
    create db
    create doc
    create lib
    create lib/tasks
    create log
    create public/images
    create public/javascripts
    create public/stylesheets
    create script/performance
    create test/fixtures
    create test/functional
    create test/integration
    create test/performance
    create test/unit
    create vendor
    create vendor/plugins
    create tmp/sessions
    create tmp/sockets
    create tmp/cache
    create tmp/pids
    create Rakefile
    create README
    create app/controllers/application_controller.rb
    create app/helpers/application_helper.rb
    create config/database.yml
    create config/routes.rb
    create config/locales/en.yml
    create config/initializers/backtrace_silencers.rb
    create config/initializers/inflections.rb
    create config/initializers/mime_types.rb
    create config/initializers/new_rails_defaults.rb
    create config/initializers/session_store.rb
    create config/environment.rb
    create config/boot.rb
    create config/environments/production.rb
    create config/environments/development.rb
    create config/environments/test.rb
    create script/about
    create script/console
    create script/dbconsole
    create script/destroy
    create script/generate
    create script/runner
    create script/server
    create script/plugin
    create script/performance/benchmarker
    create script/performance/profiler
    create test/test_helper.rb
    create test/performance/browsing_test.rb
    create public/404.html
    create public/422.html
    create public/500.html
    create public/index.html
    create public/favicon.ico
    create public/robots.txt
    create public/images/rails.png
    create public/javascripts/prototype.js
    create public/javascripts/effects.js
    create public/javascripts/dragdrop.js
    create public/javascripts/controls.js
    create public/javascripts/application.js
    create doc/README_FOR_APP
    create log/server.log
    create log/production.log
    create log/development.log
    create log/test.log
    Tue Oct 06 23:50 /software maco$ cd cars4sale
    Tue Oct 06 23:50 /software/cars4sale maco$ script/generate scaffold
    Car make:string model:string yr:string
    exists app/models/
    exists app/controllers/
    exists app/helpers/
    create app/views/cars
    exists app/views/layouts/
    exists test/functional/
    exists test/unit/
    create test/unit/helpers/
    exists public/stylesheets/
    create app/views/cars/index.html.erb
    create app/views/cars/show.html.erb
    create app/views/cars/new.html.erb
    create app/views/cars/edit.html.erb
    create app/views/layouts/cars.html.erb
    create public/stylesheets/scaffold.css
    create app/controllers/cars_controller.rb
    create test/functional/cars_controller_test.rb
    create app/helpers/cars_helper.rb
    create test/unit/helpers/cars_helper_test.rb
    route map.resources :cars
    dependency model
    exists app/models/
    exists test/unit/
    exists test/fixtures/
    create app/models/car.rb
    create test/unit/car_test.rb
    create test/fixtures/cars.yml
    create db/migrate
    create db/migrate/20091007065137_create_cars.rb
    Tue Oct 06 23:51 /software/cars4sale maco$ rake db:migrate
    (in /software/cars4sale)
    == CreateCars: migrating
    =====================================================
    -- create_table:)cars)
    -> 0.0018s
    == CreateCars: migrated (0.0020s)
    ============================================

    Tue Oct 06 23:51 /software/cars4sale maco$
    Tue Oct 06 23:54 /software/cars4sale maco$ cat debug_this.rb

    car1 = Car.new:)make => "Chevy", :model => "Camaro", :yr => "1970")
    car1.save
    debugger
    cars = Car.find :all
    Tue Oct 06 23:54 /software/cars4sale maco$
    Tue Oct 06 23:54 /software/cars4sale maco$
    Tue Oct 06 23:54 /software/cars4sale maco$ rdebug script/runner
    debug_this.rb
    /software/cars4sale/script/runner:2
    require File.dirname(__FILE__) + '/../config/boot'
    (rdb:1) c
    debug_this.rb:5
    cars = Car.find :all
    (rdb:1) s
    /pt/r1/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/
    base.rb:608
    options = args.extract_options!
    (rdb:1) l
    [603, 612] in /pt/r1/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/
    active_record/base.rb
    603 # person = Person.find(1, :lock => true)
    604 # person.visits += 1
    605 # person.save!
    606 # end
    607 def find(*args)
    => 608 options = args.extract_options!
    609 validate_find_options(options)
    610 set_readonly_option!(options)
    611
    612 case args.first
    (rdb:1) quit

    Really quit? (y/n) y

    Tue Oct 06 23:55 /software/cars4sale maco$
    Tue Oct 06 23:55 /software/cars4sale maco$

    So for the Car class, its .find() method is in this file at line 608:

    /pt/r1/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/
    base.rb
    Scott G Smith, Oct 7, 2009
    #3
  4. On 10/07/2009 09:42 AM, Scott G Smith wrote:
    > It turns out the answer to my question was actually answered by me
    > when I was taking out the trash.
    >
    > The answer is: Just use the debugger.
    > When I "step into" a method,
    > the debugger gives me the file name of that method.


    An alternative is to use set_trace_func: IIRC that also provides file
    name and line number so you can identify the source.

    Kind regards

    robert

    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, Oct 7, 2009
    #4
  5. Scott G Smith

    Roger Pack Guest


    > Is there a way I can find the module or string.rb which defined the
    > length() method?


    In 1.9 (and REE?) it's
    >> p = ''
    >> p.method:)length).source_location


    That won't help if it's from a .c file, but will if it's from a .rb
    file.

    -r
    --
    Posted via http://www.ruby-forum.com/.
    Roger Pack, Oct 7, 2009
    #5
    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. Patrick Kowalzick
    Replies:
    5
    Views:
    458
    Patrick Kowalzick
    Mar 14, 2006
  2. Martin Kahlert

    Does Ruby have anything like isprint?

    Martin Kahlert, Dec 2, 2004, in forum: Ruby
    Replies:
    3
    Views:
    353
    Robert Klemme
    Dec 2, 2004
  3. Dan Bikle
    Replies:
    3
    Views:
    129
  4. Aston J.
    Replies:
    13
    Views:
    484
    Justin Collins
    Mar 16, 2011
  5. Tom
    Replies:
    2
    Views:
    78
    Thomas 'PointedEars' Lahn
    Jul 18, 2004
Loading...

Share This Page