It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 10 years ago.
I have the following code:
def test_compare()
if true
condition = true
else
condition = false
end
assert_equal(true, condition)
end
In Ruby, variables inside of an if block have the same scope as variables declared outside of the if block according to "I don't understand ruby local scope".
Is it common practice to initialize variables inside of a control structure without first declaring them or initializing them outside of a control structure?
Coming from a Java.NET background this seems to make the code less readable and more prone to logic mistakes.
I am doing my best to "not write .NET code in Ruby", but want to understand why the above makes more sense than declaring scope variables at the beginning of the scope, or outside of the control structure.
if returns value. It's cleaner to use this behaviour.
x = if condition
# several lines of calculations can be here
'true value'
else
# several lines of calculations can be here
'false value'
end
Or, in this concrete case it's better to use ternary operator. It does the same thing and is shorter.
x = condition ? 'true value' : 'false value'
Related
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 9 years ago.
Lets say,
script = Array.new
script.push("/home/dexter/constant.sh")
script.push("/home/dexter/constant_validation.rb")
script.push("/home/dexter/jobs/reporter.rb")
Now when I use array's delete_if method,
script.compact.delete_if {|s| s =~ /constant/}
This should remove elements from array containing "constant". This is the output I get when i perform it under interactive ruby.
puts script => ["/home/dexter/jobs/reporter.rb"]
I am pushing the elements into the array with the help of regular expression matching.
Any ideas what am I doing wrong?
Cheers.
While delete_if is destructive and work on the message receiver, since you use compact method which returns different instance from self, the instance you send delete_if message to, is different from the script.
So, you will get desired result if you run script.compact! then script.delete_if.
There is no delete_if! since delete_if itself modify self.
script = Array.new
script.push("/home/dexter/constant.sh")
script.push("/home/dexter/constant_validation.rb")
script.push("/home/dexter/jobs/reporter.rb")
script
#=> ["/home/dexter/constant.sh",
"/home/dexter/constant_validation.rb",
"/home/dexter/jobs/reporter.rb"]
As #shigeya said above, compact returns different instance of self. You can verify that as:
script.object_id
#=>72421740
script.compact.object_id
#=> 71512710
Thus, by using compact in chain with delete_if, you are making changes on the object array returned by script.compact and not script itself,
`delete_if` **will** destruct the calling array
script.delete_if { |s| s =~ /constant/ }
=> ["/home/dexter/jobs/reporter.rb"]
script
=> ["/home/dexter/jobs/reporter.rb"]
Ok.. so the mistake i was doing in the script was,
I was adding elements into the script array in my script with the help of regular expressions.
So when I did a class check on the elements of the array i found that they were of type "MatchData" and hence the delete_if was not working.
If you want to do it in one line it would need to look like:
script.tap{|s| s.compact}.delete_if {|s| s =~ /constant/}
Otherwise your changes won't affect script.
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 9 years ago.
Does polymorphism exist in Ruby? I've read that Ruby does not support polymorphism, and instead it supports method overloading and method overriding. Can someone clarify this for me with an example?
Yes, Ruby does support polymorphism.
Consider the case of simple class inheritance where an instance of a derived class "is a" instance of both the child and parent classes:
class Parent; end
class Child < Parent; end
o = Child.new
o.is_a?(Child) # => true
o.is_a?(Parent) # => true
Note that this example is also valid for included modules:
a = Array.new
a.is_a?(Array) # => true
a.is_a?(Enumerable) # => true
Of course, Ruby also encourages duck typing, which may be the source of confusion regarding the question of properly supporting polymorphism.
Ruby is a highly polymorfic language, in the sense methods don't automatically infer what data type you are passing to them, as long as the object behaves like expected. Example:
def concat(a,b)
a.to_s + b.to_s
end
concat('a', 'bcd') #=> "abcd"
concat(5, 10) #=> "510"
concat([1,2,3], ' is an Array') #=> "[1, 2, 3] is an Array"
As long as a and b respond to to_s, the function will output as expected. Check more about Duck Typing for examples.
Ruby doesn't support method overloading. The very idea of method overloading doesn't even make sense in a dynamically typed language.
Ruby does support ad-hoc polymorphism, just like pretty much every object-oriented language on the planet.
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 9 years ago.
If I wanted to use a Try-Catch for a char and to make sure that it wouldn't have the program run when I typed in a numeric value how would I do that in visual basic? Example of a small snippet of code would be great.
You should not use a Try/Catch for normal program control flow. Exceptions are for just that: exceptional circumstances you do not expect to occur normally.
Rather than use an exception to blow up when a character contains a numeric, prevent it being stored
in the first instance.
A good way to achieve this is by adding a KeyPress handler.
Here's an example of a KeyPress handler that allows only Numerics and backspace (it's in C# but it is easy to convert to VB.NET):
private void txtTimeout_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !(Char.IsNumber(e.KeyChar) || e.KeyChar == '\b');
}
Set KeyPressEventArgs.Handled to true to cancel the KeyPress event.
This keeps the control from processing the key press.
There are further examples here and on StackOverflow.
Private Sub textBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) _
Handles textBox1.KeyPress
' Determine what is a valid key press
If Char.IsNumber(e.KeyChar) = True Then
' Stop the character from being entered into the control since it is numeric
e.Handled = True
End If
End Sub
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 11 years ago.
Here's what I am trying to do: The user enters a string. The string contains 2 parts and will look like this:
{EventClass: someMethod=>arg1, arg2, arg3....}, {Action: someMethod=>arg1, arg2, arg3....}
A concrete example of this would be:
{TwitterEvent: newTweet=>arg1, arg2, arg3....}, {PersistenceAction: saveToHardDrive=>arg1 arg2...}
Then I will parse this string, instantiate an instance of TwitterEvent, call that method on it. Then do the same thing for PersistenceAction
What the best "design" for this type of application? How would I dynamically instantiate classes from parsed string and then call method? And potentially, the method will have arguments? How would I detect/handle errors?
Get class object from name string:
Kernel.const_get('TwitterEvent')
Invoke arbitrary method on object:
event.send(:new_tweet)
The rest is up to you. :-)
You want to use respond_to? and send . Send allows you to invoke a method using a symbol. You can use to_sym to convert a string to a symbol.
Here you go
str = "{TwitterEvent: newTweet=>arg1, arg2, arg3}, {PersistenceAction: saveToHardDrive=>arg1, arg2}"
regexp = /^{(\w+):\s*(\w+)=>([^}]+)},\s*{(\w+):\s*(\w+)=>([^}]+)}$/
regexp.match(str).to_a[1..-1].each_slice(3) do |s|
# s[0] .. class name
# s[1] .. class method
# s[2] .. method parameters as a single string
# do something similar to Sergio Tulentsev suggestion
end
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 12 years ago.
"true"? "Yes" : "No" , I am using ruby language
This is taking by deafult "yes" even I select "no"
value = condition ? value-if-true : value-if-false
is a shortcut for this
if condition == true
value = value-if-true
else
value = value-if-false
If you have a condition that is always evaluated as true, you will always have value-if-true. In the example code "true" is always a true expression. The only values which are treated as false in an expression are false and nil.
It's a little hard to tell what you're taking, but the value "true" is a string. For the boolean value, you want just true, with no quotation marks.