Shuaib Z. wrote:
f = gets
“apple”, 5, 8.9, “red”
after i split them in an array
arr = f.split(", ")
they will be all converted into string and stored in arr as elements of
array.
There is no conversion going on there. gets returns a string and that
string
is then split into an array of substrings. There was never any object
involved that wasn’t a string.
I need to check whether the type of 5 is integer or not, 8.9 is float,
etc.
The class of 5 is Integer. The class of “5” is String. If you want to
check
whether a given string is a valid string-representation of an Integer
you
can use Interger(str), which will raise if str is not a valid integer-
representation.
Is there any mechanism that allows me to check the data type ?
Object#class and Object#is_a? but both of those will tell you that your
object is a string because it is. There is no method which tells you
which
class your string is valid string-represantation of since that can’t be
unambiguously determined. You can only check whether your string is a
valid
represantation of an object of ClassA and if it isn’t check if it is for
ClassB and so on.
So in your case you could do something like:
arr = gets.split(/\s*,\s*/).map do |str|
case str
when /^"([^"]*)"$/
$1
when /./
Float(str)
else
Integer(str)
end
end
This assumes that everything that is in quotes is a string and
everything else
is a number - a float if there’s dot in it, an integer otherwise. This
will
blow up, though, if a string contains a comma (so will yours btw). It
will
also accept “foo"bar” as a valid string. If you change the re to be
non-greedy
it won’t accept that anymore, but it also won’t accept “foo"bar”. It
also
won’t realize that 5e4 is supposed to be a float as it doesn’t contain a
dot.
If you’d change the regex to look for 'e’s as well as dots, it will
mistake
hex-numbers containing 'e’s as floats.
Another solution would be
arr = gets.split(/\s*,\s*/).map {|str| eval str}
This will also blow up on commas inside strings, but other than that it
will
handle any valid ruby expression correctly. However, this is extremely
unsafe
for obvious reasons, so you shouldn’t do it.
HTH,
Sebastian