(ruby)(python3)(node.js)(c++)(c#)(java) いろんな言語の超基本的なクラス定義を書き並べてみる

rubyに関する記事一覧→ rubyのまとめ
node.jsに関する記事一覧→ node.jsのまとめ



クラス定義っていろんな言語使ってるとなんかごっちゃになってしまいますよね
そこで、各言語の超基本的なクラス定義を書き並べて比較してみることにしました
全てやっていることは同じで、Nekoクラスを定義して 名前を「ミケ」にセットして、挨拶をさせています


c++

#include <iostream>
#include <stdio.h> //printf用
class Neko
{
	private:
		std::string name;
	public:
		Neko(std::string new_name)
		{
			name = new_name;
		};
		void hello()
		{
			std::cout << "吾輩は " << name << " である" << std::endl; // c++的にはこちらの方が一般的?
			printf("吾輩は %s である", name.c_str()); // prinfで出力する場合は c_strでchar*に変換する
		};
};
int main(int argc, char* argv[])
{
	Neko mike = Neko("ミケ");
	mike.hello();
};


node.js

#!/usr/local/bin/node
class Neko{
	constructor(new_name){
		this.name = new_name;
	};
	hello(){
		console.log('吾輩は '+ this.name + ' である');
	};
};
const mike = new Neko('ミケ');
mike.hello();


ruby

#!/usr/local/bin/ruby -Ku
class Neko
	def initialize(new_name)
		@name = new_name
	end
	def hello()
		puts('吾輩は ' << @name << ' である')
	end
end
mike = Neko.new('ミケ')
mike.hello()


python3

#!/usr/bin/python3
class Neko:
	def __init__(self, new_name):
		self.name = new_name
	def hello(self):
		print("吾輩は " + self.name + " である")
mike = Neko("ミケ")
mike.hello()


C#

namespace NekoApp
{
	class Neko
	{
		private string name;
		public Neko(string new_name)
		{
			name = new_name;
		}
		public void hello()
		{
			System.Console.WriteLine("吾輩は " + name + " である");
		}
	}
	class NekoMain
	{
		static void Main()
		{
			Neko mike = new Neko("ミケ");
			mike.hello();
		}
	}
}


java

class Neko{
	private String name;
	public Neko(String new_name){
		name = new_name;
	};
	public void hello(){
		System.out.println("吾輩は " + name + " である");
	};
};
public class ClassTest{
	public static void main(String[] args){
		Neko mike = new Neko("ミケ");
		mike.hello();
	};
};

(node.js)(javascript) インスタンスのクラス名を調べたい

node.jsに関する記事一覧→ node.jsのまとめ



インスタンスのクラスを調べようとして typeof を使っても objectとしか返ってこない時があって困る事がありますが
きちんとクラス名を調べたい時は Object.prototype.toString を使います

#!/usr/local/bin/node

const puts = console.log;
const classname = Object.prototype.toString;
puts(classname.call({a: 1024, b: 2048}));
puts(classname.call(undefined));
puts(classname.call(1));
puts(classname.call(Infinity));
puts(classname.call(null));
puts(classname.call(true));
puts(classname.call([1,2,3]));
puts(classname.call("hello"));
puts(classname.call(new RegExp()));
puts(classname.call(()=>{}));

のようにします
今回の例だと

[object Object]
[object Undefined]
[object Number]
[object Number]
[object Null]
[object Boolean]
[object Array]
[object String]
[object RegExp]
[object Function]

という結果が得られます


いちいち call するのが億劫だという場合は

#!/usr/local/bin/node

const puts = console.log;
const classname = (obj)=>{return Object.prototype.toString.call(obj)};
puts(classname(new RegExp()));

みたいにすればいいですね

(WSL) Windows側のPATHを取り込まないようにする

WSLは デフォルトだとWindows側の環境変数のPATHを取り込んでしまいます
それが好ましくないと思う場合はレジストリを変更することでLinux環境だけのパスにすることが可能です


Windows側のPATH取り込み無効化のレジストリファイル

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LxssManager]
"DistributionFlags"=dword:fffffffd

このレジストリファイルを実行するか
直接レジストリエディタで DistributionFlags を追加してください
元に戻したい場合は DistributionFlags を削除してください

(WSL)(ruby) WSLの環境でpryを使うと最初にパーミッションの警告が出て五月蠅い場合

rubyに関する記事一覧→ rubyのまとめ



pryが出すメッセージの通り ディレクトリのパーミッションが777になっているのがあるのが原因です

指定したディレクトリ以下のディレクトリを一括して755にしてあげましょう

find /home/<ユーザ名>/.rbenv -type d -exec chmod 755 {} +

インストール直後だとrbenvでもrvmでも同じように警告が出されるので
まずは .rbenv や .rvm のディレクトリを指定してやりましょう


それ以外のケースだと
node.js の n などをインストールした後に同じ警告が出るケースがあります
もちろん上のコマンドを読み替えて

find /home/<ユーザ名>/n -type d -exec chmod 755 {} +

の様にすれば解決します
面倒ですがWSLの環境下では警告が出るたびに
関連のディレクトリに上のコマンドを実行してあげましょう

(ruby)(rbenv) rbenvでrubyをインストール

rubyに関する記事一覧→ rubyのまとめ



注意:

この記事の内容は
ubuntu 17.10
lubuntu 17.10
Windows Subsystem for Linux(WSL)
Fedora 27
CentOS 7
の環境で動作を確認しています、
その他の環境ではうまく行かない可能性がありますので予めご了承ください


rvmが入っている環境ならまずはrvmを除去します

rvm seppuku

でアンインストールして
.bashrc等に追加した source ~/.rvm/scripts/rvm の部分を削除してください
端末を再起動したのち rvmの環境が無くなったかを確認してください


ここから rbenvのインストール手順の本編です
githubから引っ張ってくるのが手っ取り早いです

git clone https://github.com/rbenv/rbenv.git ~/.rbenv


.bashrcなどに以下を追加します

if [ -e $HOME/.rbenv ]; then
    export PATH="$HOME/.rbenv/bin:$PATH"
    eval "$(rbenv init -)"
fi


ここで端末を一旦再起動します


rbenvが使えるようになったかを確認します

type rbenv

を実行して、以下のような結果が返ってきているならOKです

rbenv は関数です
rbenv ()
{
    local command;
    command="${1:-}";
    if [ "$#" -gt 0 ]; then
        shift;
    fi;
    case "$command" in
        rehash | shell)
            eval "$(rbenv "sh-$command" "$@")"
        ;;
        *)
            command rbenv "$command" "$@"
        ;;
    esac
}


続けて rbenv install を使えるようにします

git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

rbenv ins 位まで入れて Tabキーで rbenv install と補完されるようになっているならインストールに成功しています


続いて、rbenvでrubyをインストールする前に、rubyのビルドに必要な物をインストールします
(ここに書いているのはdebian/ubuntu系の方法です、その他の環境の場合は読み替えて対応するものをインストールしてください)

sudo apt-get install build-essential libssl-dev libreadline-dev zlib1g-dev

redhat系だとおそらく 以下のでおおよそ同等になるかと思います

sudo yum groupinstall 'Development tools'
sudo yum install openssl-devel readline-devel zlib-devel


とりあえずの基本的な使い方は

rbenv install -list でインストール可能なバージョン一覧表示
rbenv install <バージョン> で指定したバージョンをビルドインストール
rbenv versions でインストール済バージョン一覧表示
rbenv global <バージョン> で通常使用するバージョンを指定
rbenv local <バージョン> でそのディレクトリ内で使用するバージョンを指定
rbenv local --unset でローカルで使用するようにした設定を解除
rbenv uninstall <バージョン> で指定したバージョンをアンインストール


インストール可能なバージョンのリストを更新したい場合は
ruby-buildのあるディレクトリ(~/.rbenv/plugins/ruby-build) へ移動して

git pull

git fetch --prune
git merge origin/master

などとして最新の状態にしてあげればOKです