Where to start?
-
ruby always returns something, even if its "nil". methods always return whatever is on the last line of the method. So whatever
$loaded_files.include? filename.downcase
returns is what that method will return. If your uncomfortable with that, you can always put a return in front of it for fun -return $loaded_files.include? filename.downcase
No, the question mark does not mean boolean. It is just another character you can use in a method name. So it just helps make it read a little bit more like english.
In the e and |e| question, "e" is variable that represents the object that is being processed. So entities.each is going to process each object in the entities collection. Each time, the object that is being processed will be called e. So essentially the line of code is saying push (as in push/pull) the sketchup object (e) if that object (e) is a face. If its not a face, it moves on to the next object in the entities collection.
-
If you're new to Ruby I recommend "Ruby in Twenty Minutes": http://www.ruby-lang.org/en/documentation/quickstart/
As for SketchUp API, have a look at the sticky forum posts in this Developers section.
-
Yup. So it is similar to foreach (PHP and other languages that use that syntax like foreach ($arr as $key => $val ) {} ). Ruby is very similar to JQuery and Javascript.
-
for key, value in array puts "#{key} - #{value}" end
array.each { |key,value| http://www.thomthom.net/software/vertex_tools/manual }
-
puts "Hello #{name.capitalize}!"
You can "add" any method to string inside string? That is awesome.
Class syntax:
class Greeter def initialize(name = "World") @name = name end end
Does the class can have something like:
class Greeter @name = "" @myname = end
Or you cannot define variables outside method?
It looks like I have use initialize method to define instances before all
Is this @ used only in classed? I have seen using
@@time_start = Time.now
what does mean the @@?
-
@rumcajs said:
puts "Hello #{name.capitalize}!"
You can "add" any method to string inside string? That is awesome.
That's string interpolation / it's the most efficient way to concatenate strings.
@rumcajs said:
what does mean the @@?
Class variable - single @ is instance variables. Have a look at the Ruby in Twenty minutes link. It goes through all the basics like this.
-
@thomthom said:
Have a look at the Ruby in Twenty minutes link. It goes through all the basics like this.
Yeah, I've just finished.
Is it only way of detecting if variable is array or do you have more ways? (inside class)
if @names.respond_to?("each") end
-
I'm having a fun with this:
http://tryruby.org/levels/1/challenges/0#levels/1/challengesThis interactive guide for ruby is really cool. Somebody could make one for ruby beginners in SU, don't you think? It looks simple to do something like that.
-
@rumcajs said:
@thomthom said:
Have a look at the Ruby in Twenty minutes link. It goes through all the basics like this.
Yeah, I've just finished.
Is it only way of detecting if variable is array or do you have more ways? (inside class)
> if @names.respond_to?("each") > end
@names.is_a?( Enumerable )
Btw, - strings are slow, avoid them if you can. For
respond_to?("each")
useSymbol
s instead - like so:respond_to?(:each)
-
@thomthom said:
Btw, - strings are slow, avoid them if you can. For
respond_to?("each")
useSymbol
s instead - like so:respond_to?(:each)
Yes, I read it just now in the interactive guide I create my first hash. But don't know what is it hash, looks like an object... Why they call it hash?
-
I take it you come from Javascript background?
Object have methods - Hashes has data.
A hash is an associative array - you specify the key and value. While with an array you just insert or remove values. (PHP and Javascript blends the difference between Hashes and Arrays. In Ruby they are distinct. ) Note that the order of the elements in arrays is based on the order they where added. When you iterate a Hash the values and keys is returned in a different order from how they where inserted. -
OK. So summary.
Objects can keep properties (@name...) and methods.
Arrays [] are only non-associative.
Hashes {} are associative arrays, not ordered.Can you print function or method just like in JS? I know more scripting languages not just JS. Last one is AHK.
-
I tried this (interactive guide):
ratings = Hash.Ānew(0) => {} Success! > books.valuĀes.each { |rateĀ| ratinĀgs[rate] += 1 } => [;splendid, ;quite_good, ;mediocre, ;quite_not_good, ;abysmal] > ratings => {;splendid=>1, ;quite_good=>1, ;mediocre=>1, ;quite_not_good=>1, ;abysmal=>1} >
And it is not clear to me, hoq the value 1 is assigned to the values. I guess that first command created new hash ratings. Then I go through each value of the hash and set the ratings... But how is it possible, that ratings hash overwrite the book.values? As I know this is problem in PHP. If you know something like
foreach(books->valuĀes as $val){ ; this will not work; val="new value"; }
It will not overwrite the for values of "values" property. Maybe the relation between ratings and books.valuĀes was already defined somewhere in a class, which is not visible to me?
This command does not work to me as expected:
.. File.Open(Ā"/Home/comĀics.txt", "a") do |f| .... jjj .. ss
I can write in the file but how to close it and to keep data in it? There should be some other stuff in the file when I write File.Open(Ā"/Home/comĀics.txt", "a") . Once I succeeded there were some links and they say, that is should add some data in file...
-
@rumcajs said:
I tried this (interactive guide):
ratings = Hash.Ānew(0) > => {} > Success! > > books.valuĀes.each { |rateĀ| ratinĀgs[rate] += 1 } > => [;splendid, ;quite_good, ;mediocre, ;quite_not_good, ;abysmal] > > ratings > => {;splendid=>1, ;quite_good=>1, ;mediocre=>1, ;quite_not_good=>1, ;abysmal=>1} > >
And it is not clear to me, how the value
1
is assigned to the values.Because the Ruby interpreter changes the shorthand
a += b
, toa = a + b
So your statement:
books.valuĀes.each { |rateĀ| ratinĀgs[rate] += 1 }
is actually executed as:
books.valuĀes.each { |rateĀ| ratinĀgs[rate]= ratinĀgs[rate] + 1 }
-
Method names begin with a lower case character (by convention.)
So it is:
` File.open("path/to/file","w") do |f|
end`
The block form of
IO::open
with automatically close the file handle. -
Something else confused me. But i think I had overlooked something. The ratings are not saved in values, but in ratings...
Things are going bad, I cannot move on.
#<SyntaxError; Invalid char "\xC2" in expression. near line 1; "\xADread(\"/Hom\xC2\xADe/comics.t\xC2\xADxt\")"> > print File.ĀĀread("/coĀmics.tĀxt"Ā) => #<SyntaxError; Invalid char "\xC2" in expression. near line 1; "\xADread(\"/comics.t\xC2\xADxt\")"> > print File.Āread("comiĀcs.txt") => #<Errno;;ENOENT; No such file or directory - comics.txt> > Dir["/*"] => [] Open up a new BlogEntry class, pretty pretty please. >
How can I print what is in /home/comics.txt and /comics.txt and if they exists and why this error happens...
-
Whatever i write it jumps into input mode:
comics.is_Āa .. end > comics.is_Āa? ..
Damn, that's not 15 minutes tutorial, but 15 hours (I'm in half but cannot move on).
> Popup.makeĀ do .... h1 "Header" .... list do ...... comics.eacĀh do |nameĀ, url| ........ link name,Ā url ........ end ...... end .... end ..
Should generate web page, but nothing popups. And I cannot check if the array exists, what is in array, what is in directory or if the file exist... Look like not realy ruby console (running in browser).
-
defined?(comics)
tests for existancecomics.is_a?(Array)
or
comics.instance_of?(Array)
or
comics.class==(Array)
tests the class of thecomics
object -
@rumcajs said:
How can I print what is in /home/comics.txt and /comics.txt and if they exists and why this error happens...
You cannot assume that the current working directory is what you wish it to be (because another plugin may have changed it.)
Be sure a HOME environment var is defined on PC (it is always defined on Unix-like systems, such as OSX.)
unless RUBY_PLATFORM =~ /(darwin)/i ENV["HOME"]= ENV["USERPROFILE"] unless ENV["HOME"] end
oldDir = Dir.getwd() Dir.chdir(ENV["HOME"]) if File.exist?('comics.txt') lines = IO.readlines('comics.txt') puts(lines) else puts("'comics.txt' could not be found.") end Dir.chdir(oldDir)
or use the
**~**
shortcut (if you KNOW that aHOME
environment var is defined.)filepath = File.expand_path('~/comics.txt') if File.exist?(filepath) lines = IO.readlines(filepath) puts(lines) else puts("'#{File.basename(filepath)}' could not be found in dir;\n#{File.dirname(filepath)}.") end
-
@rumcajs said:
Things are going bad, I cannot move on.
Because you NEED to read "Programming Ruby: The Pragmatic Programmer's Guide"
You need to take a WEEK OR MORE getting comfortable with Standard Ruby, before attempting to learn to use the SketchUp API.
I wrote the "Ruby Newbie's Guide to Getting Started" to help you and others avoid the frustration you are experiencing.
Follow the guide and you will be much happier.
Advertisement