Two Variables to One Definition?


#1

Is it possible to send two different variables to one definition and
then use them separately in that definition?

Here’s what I’m trying to do.

==============

#item = url
#species = pet

def exists(item)

existingitems = YAML.load(File.open("./#{species}.yaml"))

existingitems.each {

|exist|

if exist == item

return false

end

}

return true

end

pets.each do |pet|
files.each do |url|
if exists(url)

here I want to send both the pet and url variable up to definition

      puts "Exists"
 else
      puts "Nope"
 end

end
end

=============

I have it all working with just the url, but I need it to know what pet
it’s on so it knows what file to open and search in.

Anyone have any suggestions?

P.S. This code isn’t an exact copy, I took out a lot of fluff and stuff
to shorten it for the example; it probably won’t work if you try and
test the code. I’m just looking to see if there is a way to send both
variables up to the definition and then be able to use them?


#2

Sorry, I just figured it out.

if exists(url, pet)

^ that seems to be working

then in my def i put

def exists(item, species)

:slight_smile:

If anyone has something better feel free to let me know.


#3

On 26.10.2008 18:59, Tj Superfly wrote:

:slight_smile:

If anyone has something better feel free to let me know.

If you do the same test against the same collection it is cleaner to
just have one parameter and invoke the method twice. But you do not
tell us what logical connection there should be between the two. It
seems you ripped out too much of the original code, for example
“species” is missing and we do not know where it comes from.

Cheers

robert


#4

Since you already got the solution to your original question I’ll show
you how you can refactor this code:

Tj Superfly wrote:

#item = url
#species = pet

def exists(item)
existingitems = YAML.load(File.open("./#{species}.yaml"))
existingitems.each {
|exist|
if exist == item
return false
end
}
return true
end

convention in ruby is to speak in 2nd person, ? is a valid last

character in a method definition
def exist?(item, species)

depending on your situation you’d better load the yaml files once at

the beginning instead of here

YAML.load_file is to favor over YAML.load(File.open)

existing_items = YAML.load_file “./#{species}.yaml”

any? is found in Enumerable, it shortcuts and takes a block to test

items in the collection against
existing_items.any? { |existing| item == existing }
end

Since most likely your collection even responds to #include? properly,
you can use that, so with preloading the files and everything:
def initialize
@species = {}
Species.each { |name|
@species[name] = YAML.load_file “./#{name}.yaml”
}
end

def exist?(item, species)
@species[name].include?(item)
end

You might even want to make seperate classes for your species, then you
can avoid the 2nd argument entirely.

Regards
Stefan