So I’ve been getting used to a couple new languages lately, mostly Ruby and Java but also Python and C++ for comparison. Coming from PHP, VBScript and JavaScript has confused the hell out of me.

The hardest part so far is not strict types, which I expected would mess me up. It’s block-level scope. For example, in PHP you could:

<?php
if ( $_GET['name'] ) {
    $name = $_GET['name'];
} else {
    $name = "World";
}
echo "Hello $name!";
?>```

But in C++ and Java, variables defined within *any* block (section wrapped in {}), are only visible in that block and its descendant blocks, so when I tried

class HelloWorld
{
public static void main ( String[] args )
{
if ( args.length > 0 ) {
String name = args[0];
} else {
String name = "World";
}
System.out.println("Hello "+name+"!");
}
}


it wouldn’t compile, saying “name cannot be resolved.” It took me a while to figure this one out.

Fortunately I had some help from a friend but honestly it still seems counter-intuitive to need to declare a value before copying a fixed value. For the record, here’s a version of the last class that works:

class HelloWorld
{
public static void main ( String[] args )
{
String name;
if ( args.length > 0 ) {
name = args[0];
} else {
name = "World";
}
System.out.println("Hello "+name+"!");
}
}