This can be done in almost endless different ways of course. Here are
two other options:

    class Job
        def initialize(file=nil, &block)
            raise "need file or block" unless file or block
            @file = file
            @block = block
        end

        def do
            if @file
                File.read @file
            else
                @block.call
            end
        end
    end


    class Job
        def initialize(file=nil, &block)
            raise "need file or block" unless file or block
            @task = block || lambda { File.read file }
        end

        def do
            @task.call
        end
    end

The second one is a slightly cleaned up version of your first
proposal.

Regards,
Thomas.