名前と年齢を保持するクラスを定義して、インスタンス化し、名前と年齢をセットして文字列に変換する。
Java
- class Person {
- private String name;
- private int age;
- public String getName() { return name; }
- public void setName(String name) { this.name = name; }
- public int getAge() { return age; }
- public void setAge(int age) { this.age = age; }
- @Override
- public String toString() {
- return String.format("%s (%d years old)", name, age);
- }
- }
- Person p = new Person();
- p.setName("Taro");
- p.setAge(20);
- String s = p.toString();
Groovy
- class Person {
- String name
- int age
- @Override String toString() { "${name} (${age} years old)" }
- }
- def p = new Person(name: 'Taro', age: 20)
- def s = p.toString()
Kotlin
- class Person {
- var name: String? = null
- var age = 0
- override fun toString() = "$name ($age years old)"
- }
- val p = Person()
- p.name = "Taro"
- p.age = 20
- val s = p.toString()
Scala
- class Person {
- var name: String = _
- var age: Int = _
- override def toString = "%s (%d years old)".format(name, age)
- }
- class Person(var name: String, var age: Int) {
- def this() = this(null, 0)
- override def toString = "%s (%d years old)".format(name, age)
- }
- val p = new Person
- p.name = "Taro"
- p.age = 20
- val s = p.toString
F#
- type Person() =
- member val Name = "" with get, set
- member val Age = 0 with get, set
- override this.ToString() = sprintf "%s (%d years old)" this.Name this.Age
- let p = new Person()
- p.Name <- "Taro"
- p.Age <- 20
- let s = p.ToString()
C#
- class Person {
- public string Name { get; set; }
- public int Age { get; set; }
- public override string ToString() {
- return $"{Name} ({Age} years old)";
- }
- }
- var p = new Person { Name = "Taro", Age = 20 };
- string s = p.ToString();
C++
- #include <strstream>
- class person {
- public:
- string name;
- int age;
- operator string();
- };
- person::operator string() {
- strstream ss;
- ss << name << " (" << age << " years old)";
- return ss.str();
- }
- person p;
- p.name = "Taro";
- p.age = 20;
- string s = p;
- person p;
- p.name = "Taro";
- p.age = 20;
- string s = static_cast<string>(p);
Go
- type Person struct {
- Name string
- Age int
- }
- func (this *Person) String() string {
- return fmt.Sprintf("%s (%d years old)", this.Name, this.Age)
- }
- p := Person{"Taro", 20}
- s := p.String()
- p := Person{Name: "Taro", Age: 20}
- s := p.String()
- var p Person
- p.Name = "Taro"
- p.Age = 20
- s := p.String()
Rust
- pub struct Person<'a> {
- pub name: &'a str,
- pub age: i32,
- }
- impl<'a> fmt::Display for Person<'a> {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "{} ({} years old)", self.name, self.age)
- }
- }
- let mut p = Person {
- name: "",
- age: 0,
- };
- p.name = "Taro";
- p.age = 20;
- let s = format!("{p}");
Dart
- class Person {
- String? _name;
- String? get name => _name;
- set name(String? name) => _name = name;
- int? _age;
- int? get age => _age;
- set age(int? age) => _age = age;
- toString() => '$name ($age years old)';
- }
- var p = Person();
- p.name = 'Taro';
- p.age = 20;
- var s = p.toString();
TypeScript
- class Person {
- name: string;
- age: number;
- toString() {
- return `${this.name} (${this.age} years old)`
- }
- }
- let p = new Person();
- p.name = 'Taro';
- p.age = 20;
- let s = p.toString();
JavaScript
- class Person {
- name;
- age;
- toString() {
- return `${this.name} (${this.age} years old)`;
- }
- }
- let p = new Person();
- p.name = 'Taro';
- p.age = 20;
- let s = String(p);
CoffeeScript
- class Person
- constructor: (@name, @age) ->
- toString: -> "#{@name} (#{@age} years old)"
- p = new Person 'Taro', 20
- s = String p
Ruby
- class Person
- attr_accessor :name, :age
- def to_s
- "#{name} (#{age} years old)"
- end
- end
- p = Person.new
- p.name = 'Taro'
- p.age = 20
- s = p.to_s
Python
- class Person:
- name = None
- age = None
- def __str__(self):
- return '%s (%d years old)' % (self.name, self.age)
- p = Person()
- p.name = 'Taro'
- p.age = 20
- s = str(p)
PHP
- class Person {
- public $name;
- public $age;
- public function __toString() {
- return "{$this->name} ({$this->age} years old)";
- }
- }
- $p = new Person();
- $p->name = 'Taro';
- $p->age = 20;
- $s = (string)$p;
PHP
PHP 7.4以降
- class Person {
- public string $name;
- public int $age;
- public function __toString() {
- return "{$this->name} ({$this->age} years old)";
- }
- }
Perl
- package Person;
- use overload q/""/ => sub {
- my $self = shift;
- "$self->{name} ($self->{age} years old)";
- };
- sub new {
- my $class = shift;
- bless {}, $class;
- }
- my $p = Person->new;
- $p->{name} = 'Taro';
- $p->{age} = 20;
- my $s = "$p";
CPAN の
Class::Accessor::Lvalue を使った場合
- package Person;
- use base qw/Class::Accessor::Lvalue::Fast/;
- use overload q/""/ => sub {
- my $self = shift;
- "$self->{name} ($self->{age} years old)";
- };
- __PACKAGE__->mk_accessors(qw/name age/);
- my $p = Person->new;
- $p->name = 'Taro';
- $p->age = 20;
- my $s = "$p";
CPAN の
Class::MethodMaker を使った場合
- package Person;
- use overload q/""/ => sub {
- my $self = shift;
- "$self->{name} ($self->{age} years old)";
- };
- use Class::MethodMaker [
- new => [qw/new/],
- scalar => [qw/name age/],
- ];
- my $p = Person->new;
- $p->name('Taro');
- $p->age(20);
- my $s = "$p";
インスタンス化の際に引数で名前と年齢を指定し、その後それらの値を読み出す。
Java
- class Person {
- private final String name;
- private final int age;
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public String getName() { return name; }
- public int getAge() { return age; }
- }
- Person p = new Person("Taro", 20);
- String name = p.getName();
- int age = p.getAge();
Java 16以降
- record Person(String name, int age) {}
- Person p = new Person("Taro", 20);
- String name = p.name();
- int age = p.age();
Groovy
- class Person {
- private final name
- private final age
- Person(name, age) {
- this.name = name
- this.age = age
- }
- String getName() { name }
- int getAge() { age }
- }
- def p = new Person("Taro", 20)
- def name = p.name
- def age = p.age
Kotlin
- class Person(val name: String, val age: Int)
- val p = Person("Taro", 20)
- val name = p.name
- val age = p.age
Scala
- class Person(val name: String, val age: Int)
- val p = new Person("Taro", 20)
- val name = p.name
- val age = p.age
- case class Person(name: String, age: Int)
- val p = Person("Taro", 20)
- val name = p.name
- val age = p.age
Haskell
- data Person = Person {name :: String, age :: Integer}
- instance Show Person where
- show = \ p -> (name p) ++ " (" ++ (show $ age p) ++ " years old)"
- let p = Person "Taro" 20
- let name' = name p
- let age' = age p
F#
- type Person(name : string, age: int) =
- member val Name = name with get
- member val Age = age with get
- let p = new Person("Taro", 20)
- let name = p.Name
- let age = p.Age
C#
C# 6.0以降
- class Person {
- public string Name { get; }
- public int Age { get; }
- public Person(string name, int age) {
- Name = name;
- Age = age;
- }
- }
- var p = new Person("Taro", 20);
- string name = p.Name;
- int age = p.Age;
C# 7.0以降
- class Person {
- public string Name { get; }
- public int Age { get; }
- public Person(string name, int age) => (Name, Age) = (name, age);
- }
C# 9.0以降
- record Person(string Name, int Age);
C++
- class person {
- public:
- person(const string name, const int age) : _name(name), _age(age) {}
- string name() const { return _name; }
- int age() const { return _age; }
- private:
- const string _name;
- const int _age;
- };
- person p("Taro", 20);
- string name = p.name();
- int age = p.age();
- person* p = new person("Taro", 20);
- string name = p->name();
- int age = p->age();
- delete p;
Go
- type Person struct {
- name string
- age int
- }
- func (this *Person) Name() string {
- return this.name
- }
- func (this *Person) Age() int {
- return this.age
- }
- p := Person{"Taro", 20}
- name := p.Name()
- age := p.Age()
- p := Person{name: "Taro", age: 20}
- name := p.Name()
- age := p.Age()
Rust
- pub struct Person<'a> {
- name: &'a str,
- age: i32,
- }
- impl<'a> Person<'a> {
- fn name(&self) -> &'a str {
- self.name
- }
- fn age(&self) -> i32 {
- self.age
- }
- }
- let p = Person {
- name: "Taro",
- age: 20,
- };
- let name = p.name();
- let age = p.age();
Dart
- class Person {
- final String _name;
- get name => _name;
- final int _age;
- get age => _age;
- Person(this._name, this._age);
- }
- var p = new Person('Taro', 20);
- var name = p.name;
- var age = p.age;
TypeScript
- class Person {
- constructor(readonly name: string, readonly age: number) {}
- }
- let p = new Person('Taro', 20);
- let name = p.name;
- let age = p.age;
JavaScript
- class Person {
- #name;
- #age;
- constructor(name, age) {
- this.#name = name;
- this.#age = age;
- }
- get name() {
- return this.#name;
- }
- get age() {
- return this.#age;
- }
- }
- let p = new Person('Taro', 20);
- let name = p.name;
- let age = p.age;
CoffeeScript
- class Person
- constructor: (name, age) ->
- Object.defineProperty @, 'name', value: name
- Object.defineProperty @, 'age', value: age
- p = new Person 'Taro', 20
- name = p.name
- age = p.age
Ruby
- class Person
- attr_reader :name, :age
- def initialize name, age
- @name = name
- @age = age
- end
- end
- p = Person.new 'Taro', 20
- name = p.name
- age = p.age
Python
- class Person:
- def __init__(self, name, age):
- self.__name = name
- self.__age = age
- def name(self): return self.__name
- def age(self): return self.__age
- p = Person('Taro', 20)
- name = p.name()
- age = p.age()
Python 3.7以降
- @dataclasses.dataclass(frozen=True)
- class Person:
- name: str
- age: int
- p = Person('Taro', 20)
- name = p.name
- age = p.age
PHP
- class Person {
- private $_name;
- private $_age;
- public function __construct($name, $age) {
- $this->_name = $name;
- $this->_age = $age;
- }
- public function name() {
- return $this->_name;
- }
- public function age() {
- return $this->_age;
- }
- }
- $p = new Person('Taro', 20);
- $name = $p->name();
- $age = $p->age();
Perl
- package Person;
- sub new {
- my $class = shift;
- my $self;
- $self->{$_} = shift for qw/name age/;
- bless $self, $class;
- }
- sub name {
- shift->{name};
- }
- sub age {
- shift->{age};
- }
- my $p = Person->new('Taro', 20);
- my $name = $p->name;
- my $age = $p->age;
CPAN の
Class::Accessor::Lvalue を使った場合
- package Person;
- use base qw/Class::Accessor::Lvalue::Fast/;
- our @keys = qw/name age/;
- __PACKAGE__->mk_ro_accessors(@keys);
- sub new {
- my $class = shift;
- my $self = $class->SUPER::new;
- $self->{$_} = shift for @keys;
- $self;
- }
- my $p = Person->new('Taro', 20);
- my $name = $p->name;
- my $age = $p->age;
Java
- String className = "Person";
- Object p = Class.forName(className).getConstructors()[0].newInstance("Taro", 20);
Groovy
- def className = 'Person'
- def p = Class.forName(className).getConstructors()[0].newInstance('Taro', 20)
Kotlin
- val className = "Person"
- val p = Class.forName(className).getConstructors()[0].newInstance("Taro", 20)
Scala
- val className = "Person"
- val p = Class.forName(className).getConstructors()(0).newInstance("Taro", 20.asInstanceOf[AnyRef])
- val className = "Person"
- val args = List("Taro", 20).map(_.asInstanceOf[AnyRef]).toArray
- val p = Class.forName(className).getConstructors()(0).newInstance(args: _*)
F#
- let className = "Person"
- let p = System.Type.GetType(className).GetConstructors().[0].Invoke [|"Taro"; 20|]
C#
- string className = "Person";
- object p = Type.GetType(className).GetConstructors()[0].Invoke(new object[] { "Taro", 20 });
TypeScript
- let className = 'Person';
- let p = new (eval(className))('Taro', 20);
JavaScript
- let className = 'Person';
- let p = new (eval(className))('Taro', 20);
CoffeeScript
- className = 'Person'
- p = new (eval className) 'Taro', 20
Ruby
- class_name = 'Person'
- p = eval(class_name).new('Taro', 20)
Python
- class_name = 'Person'
- p = eval(class_name)('Taro', 20)
PHP
- $className = 'Person';
- $p = new $className('Taro', 20);
Perl
- my $class_name = 'Person';
- my $p = $class_name->new('Taro', 20);
Java
- Class<?> clazz = "".getClass();
- for (int i = 0; i < 3; i++) {
- clazz = clazz.getSuperclass();
- if (clazz == null) break;
- }
Groovy
- def clazz = ''.class
- 3.times { clazz = clazz?.superclass }
Kotlin
- var clazz: Class<*>? = "".javaClass
- (1..3).forEach { clazz = clazz?.getSuperclass() }
Scala
- var clazz = "".getClass
- (1 to 3).foreach(_ => if (clazz != null) clazz = clazz.getSuperclass)
F#
- let f (typ : Type) _ =
- match typ with
- | null -> null
- | typ -> typ.BaseType
- let typ = Seq.fold f ("".GetType()) [1..3]
- let f = function
- | null -> null
- | (typ : Type) -> typ.BaseType
- let typ = Seq.fold (fun typ _ -> f typ) ("".GetType()) [1..3]
- let mutable typ = "".GetType()
- for i = 1 to 3 do
- match typ with
- | null -> ()
- | t -> typ <- t.BaseType
C#
- Type type = "".GetType();
- for (int i = 0; i < 3; i++) {
- type = type.BaseType;
- if (type == null) break;
- }
C# 6.0以降
- Type type = "".GetType();
- for (int i = 0; i < 3; i++) {
- type = type?.BaseType;
- }
Ruby
- clazz = ''.class
- 3.times { clazz = clazz.superclass unless clazz.nil? }
Python
文字列クラスが多重継承をしていない前提でなら
- t = type('')
- try:
- t = inspect.getmro(t)[3]
- except IndexError:
- None
Java
Commons Lang を使った場合
- Object = ...
- String s = ToStringBuilder.reflectionToString(obj);
Groovy
- def obj = ...
- def s = obj.dump()
Scala
case class の場合。名前は含まれないが…
- val obj = ...
- val s = obj.toString
Go
- obj := ...
- s := fmt.Sprint(obj)
TypeScript
Node.js の場合
- let obj = ...
- let s = util.inspect(obj);
JavaScript
Node.js の場合
- let obj = ...
- let s = util.inspect(obj);
CoffeeScript
Node.js の場合
- obj = ...
- s = util.inspect obj
Ruby
- obj = ...
- s = obj.inspect
Python
- obj = ...
- s = repr(obj.__dict__)
もう少し見栄えを良くしたければ
- obj = ...
- r = re.compile('^_.+__')
- s = ', '.join(r.sub('__', name) + ': ' + repr(value) for name, value in obj.__dict__.items())
PHP
- $obj = ...
- $s = var_export($obj, true);
もう少し見栄えを良くしたければ
- $obj = ...
- $vars = get_object_vars($obj);
- foreach ($vars as $name => &$value) {
- $value = $name . ': ' . var_export($value, true);
- }
- $s = implode(', ', $vars);
Perl
- my $obj = ...;
- my $s = Dumper($obj);
Groovy
メタクラスを使う方法
- String.metaClass.up = { delegate.toUpperCase() }
カテゴリーを使う方法
- class StringCategory {
- static up(String s) {
- s.toUpperCase()
- }
- }
- use (StringCategory.class) {
- println 'abc'.up()
- }
Kotlin
- fun String.up() = this.toUpperCase()
Scala
Scala 3.0以降
- extension (s: String)
- def up = s.toUpperCase
C#
- public static class StringEx {
- public static string Up(this string s) {
- return s.ToUpper();
- }
- }
TypeScript
- declare global {
- interface String {
- up(): string;
- }
- }
- String.prototype.up = function() {
- return this.toUpperCase();
- };
JavaScript
- String.prototype.up = function() { return this.toUpperCase(); };
CoffeeScript
- String::up = -> @toUpperCase()
Ruby
- class String
- def up
- upcase
- end
- end
- module StringEx
- refine String do
- def up
- upcase
- end
- end
- end
- using StringEx
- puts 'abc'.up