[#3741] Re: Why it's quiet -- standard distribution issues — Aleksi Niemel<aleksi.niemela@...>
I think it's the feature of the mailing list archive to create a threads of
[#3756] RE: XMP on comments — Aleksi Niemel<aleksi.niemela@...>
> require "xmp"
[#3766] modulo and remainder — Dave Thomas <Dave@...>
[#3776] Kernel.rand — Aleksi Niemel<aleksi.niemela@...>
How about defining:
[#3781] Widening out discussions — Dave Thomas <Dave@...>
[#3795] Re: Array.uniq! returning nil — Aleksi Niemel<aleksi.niemela@...>
> As matz said in [ruby-talk:3785] and Dave said in [ruby-talk:1229],
Hi, Aleksi,
[#3823] Re: Array.pick — Aleksi Niemel<aleksi.niemela@...>
> > Just a general comment--a brief statement of purpose and using
[#3827] JRuby? — Aleksi Niemel<aleksi.niemela@...>
Is there or will there be Ruby equivalent of JPython?
[#3882] Re: Array.uniq! returning nil — Aleksi Niemel<aleksi.niemela@...>
> |look too strange, confusing, or cryptic. Maybe just @, $, %, &.
Hi,
[#3918] A question about variable names... — Dave Thomas <Dave@...>
[#3935] If your company uses Pallets, Skids, Boxes, Lumber, etc. — pallets2@...
[#3956] Tk PhotoImage options — andy@... (Andrew Hunt)
Hi all,
[#3971] Thread and File do not work together — "Michael Neumann" <neumann@...>
following example do not work correctly with my ruby
[#3986] Re: Principle of least effort -- another Ruby virtue. — Andrew Hunt <andy@...>
> Principle of Least Effort.
Hi,
[#4005] Re: Pluggable functions and blocks — Aleksi Niemel<aleksi.niemela@...>
Aleksi makes a question:
[#4008] Ruby installation instructions for Windows — Aleksi Niemel<aleksi.niemela@...>
I had to write these instructions for my friends. I thought it might be nice
[#4043] What are you using Ruby for? — Dave Thomas <Dave@...>
On 15 Jul 2000 22:08:50 -0500,
Hi,
[#4057] Re: What are you using Ruby for? — Aleksi Niemel<aleksi.niemela@...>
Johann:
[#4082] Re: What are you using Ruby for? — Aleksi Niemel<aleksi.niemela@...>
[#4091] 'each' and 'in' — hal9000@...
I just recently realized why the default
[#4107] Re: 'each' and 'in' -- special char problem? — schneik@...
[#4114] Method signature - a question for the group — Dave Thomas <Dave@...>
[#4139] Facilitating Ruby self-propagation with the rig-it autopolymorph application. — Conrad Schneiker <schneik@...>
Hi,
[#4158] Getting Tk to work on Windows — "Michael Neumann" <neumann@...>
Hi....
[#4178] Partly converted English Ruby/Tk widget demo working. — Conrad Schneiker <schneik@...>
Hi,
[#4234] @ variables not updated within method? — Hugh Sasse Staff Elec Eng <hgs@...>
Hugh Sasse Staff Elec Eng <hgs@dmu.ac.uk> writes:
On 27 Jul 2000, Dave Thomas wrote:
[#4267] Ruby.next, Perl6, Python 3000, Tcl++, etc. -- Any opportunities for common implementation code? — "Conrad Schneiker" <schneiker@...>
Hi,
"Conrad Schneiker" wrote:
[ruby-talk:03979] Re: Pluggable functions and blocks
Aleksi writes:
> In [ruby-talk:01697] at
> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/rub
> y-talk/1697
> gotoken writes
>
> Ruby doesn't have unbounded methods as first class data,
>
> which makes me wonder why - it's such a marvellous OO lang
> with dedication for first-classness.
>
> Why we have bounded methods, like blocks, but not
> semibounded, like instance
> methods, nor unbounded, like classmethods?
and answers to himself:
Well, we *can* have objects for instance methods and class methods. The next
snippet contains one routine which should not belong there, but I bundled it
anyway. It's the Kernel#get_named. It takes the *rest argument container as
argument and returns the last contained hash if any. So one can effectively
use it with a definition and call like this
def varying_number_of_arguments_and_named_parameter(*rest)
named = get_named(rest)
p rest
named.each do |key, value| puts "#{key}=#{value}" end
end
varying_number_of_arguments_and_named_parameter(
'param1', 'param2,
'test' => 'with', 'named' => 'arguments' )
Should print:
['param1, 'param2']
test=with
named=arguments
But now to the point, here's the code that enables one to have a reference
to instance's method and call it like this:
instanceMethod = InstanceMethod.new(Test.new, :method )
instanceMethod.call('argument')
class Method # the calling interface
def call
raise "not implemented in abstract base class!"
end
end
class Block #< Method
def initialize( block=nil, &bk )
@block = block if block
@block = bk if bk
raise "no block defined" unless defined? @block
end
def call(*args) # associated block should get
@block.call(*args) # passed, but apparently won't
end
end
class InstanceMethod #< Method
def initialize( instance, method )
@instance = instance
@method = method
end
def call(*args, &blk)
@instance.send(@method, *args, &blk)
end
end
# InstanceMethod works for ClassMethods too
# The instance passed to constructor should be
# object ClassName (which is instance of class Class)
class ClassMethod < InstanceMethod
end
module Kernel
# three helper methods, for convenience
def inst_proc( instance, method )
InstanceMethod.new instance, method
end
def class_proc( klass, method )
ClassMethod.new klass, method
end
def block_proc( block=nil, &bk )
return Block.new(block) if block
return Block.new(bk) if bk
end
def get_named(rest)
# can make errors
(rest.size-1).downto(0) do |i|
return rest.delete_at(i) if rest[i].kind_of? Hash
end
return Hash.new
end
end
################################
################################
And here's the test case (and example):
require 'Method'
class Test
def initialize(test)
@test = test
end
def Test.test_class_method( arg, *rest, &bl)
named = get_named(rest)
puts "Class Method"
puts arg
p rest
named.each do |key, value| puts "#{key}=#{value}" end
bl.call
end
def test_instance_method( arg, opt="optional", &bl)
puts "Instance method"
puts @test
puts arg
puts opt
bl.call
end
def test_block_method
return proc { |arg, *rest|
puts "Block_method"
puts @test
puts arg
p rest
# yield if iterator?
}
end
end
#classMethod = ClassMethod.new(Test, :test_class_method )
classMethod = class_proc(Test, :test_class_method )
classMethod.call('argument',
'rest', 'test',
'test' => 'with', 'named' => 'arguments' ) do
puts "class method block test"
end
puts
test = Test.new("instance_data")
instanceMethod = InstanceMethod.new(test, :test_instance_method )
instanceMethod.call('argument') do
puts "instance method block test"
end
puts
inst_proc(test, :test_instance_method).call('argument', 'optional set') do
puts "instance method block test"
end
puts
test = Test.new("bound instance data")
procInstance = test.test_block_method
block = block_proc( procInstance )
block.call('argument', 'rest', 'test') do
puts "'block associated to block'-test would be here"
puts "but it seems there's no such thing"
end
puts
puts "Block_method: plain associated block"
block = Block.new do puts "here I am" end
block.call
- Aleksi